PromiseKit:无法在 then 处理程序之间调用自定义代码

Posted

技术标签:

【中文标题】PromiseKit:无法在 then 处理程序之间调用自定义代码【英文标题】:PromiseKit: can't call custom code between then handlers 【发布时间】:2019-03-22 23:07:53 【问题描述】:

刚开始使用 PromiseKit 并遇到了一个奇怪的问题 编译问题:

with first: 对成员 'firstly(execute:)' () 的模糊引用 没有firstly:无法推断复杂的闭包返回类型;添加显式

不知道我在这里做错了什么。

承诺

func test(someValue: Int) -> Promise<Void> 
    return Promise  seal in
        // do something with someValue
        seal.fulfill(())
    

这行得通:

firstly 
    test(someValue: 2)
.then 
    test(someValue: 1)
.catch  error in
    ...

但这个没有:

firstly 
    test(someValue: 2)
.then 
    let dd = 1
    return test(someValue: dd)
.catch  error in
    ...

【问题讨论】:

【参考方案1】:

我最近一直在使用 Promises,并且遇到了类似的错误,似乎有时所有的闭包和泛型都能充分利用编译器。

我发现如果你有一个catch 调用,你应该总是有一个done 调用,将它添加到catch 之前。 done 意味着您将不再链接您的承诺,然后您可以使用 PKFinalizer,就像 catch 调用一样。

如果你的 promise 有你没有使用的参数,请确保在你的下一个 then/done 调用中添加 _ in,或者你可以在两者之间添加一个 asVoid() 调用,这会丢弃结果.

编辑:

这周我也遇到了一个错误,在闭包中添加额外的行会导致它失败。因为我所做的是将一个承诺转换为多个承诺,所以我使用了flatMapThenPromise 上有几种方法可以用于不同的结果。如果你想存储 Promise 的结果并继续,你可以使用 get,如果你想将结果转换为另一种类型,可以使用 map。

例如,我会将你的失败错误翻译成这个

firstly 
    test(someValue: 2)
.map 
    1
.then 
    test(someValue: $0)
.done 
    print("success")
.catch  error in
    ...

【讨论】:

我听从了您的建议,但上面的示例仍然无法编译。 :( @Markus 我在回答中添加了更多信息 谢谢!这是一个很棒的工作,我花了整个下午试图让它工作,应该早点发布;)

以上是关于PromiseKit:无法在 then 处理程序之间调用自定义代码的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit 框架 - 对成员“then()”的模糊引用

使用 PromiseKit 时不明确地使用恢复错误

PromiseKit 分支承诺

isKindOfClass 在 PromiseKit 中返回 nil 吗?

PromiseKit 无法在链中命中

重新定义外部块(promiseKit)