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()
调用,这会丢弃结果.
编辑:
这周我也遇到了一个错误,在闭包中添加额外的行会导致它失败。因为我所做的是将一个承诺转换为多个承诺,所以我使用了flatMapThen
。 Promise
上有几种方法可以用于不同的结果。如果你想存储 Promise 的结果并继续,你可以使用 get
,如果你想将结果转换为另一种类型,可以使用 map。
例如,我会将你的失败错误翻译成这个
firstly
test(someValue: 2)
.map
1
.then
test(someValue: $0)
.done
print("success")
.catch error in
...
【讨论】:
我听从了您的建议,但上面的示例仍然无法编译。 :( @Markus 我在回答中添加了更多信息 谢谢!这是一个很棒的工作,我花了整个下午试图让它工作,应该早点发布;)以上是关于PromiseKit:无法在 then 处理程序之间调用自定义代码的主要内容,如果未能解决你的问题,请参考以下文章
PromiseKit 框架 - 对成员“then()”的模糊引用