我正在尝试将PromiseKit与Swift一起使用。我对它并不熟悉,似乎没有太多关于它与Swift一起使用的信息。
我似乎无法弄清楚如何终止承诺链。只要最后一个(终端)then
块包含单个语句,一切都很好:
firstly {
// ...
}.then { obj in
self.handleResult(obj)
}.catch { error in
self.handleError(error)
}
但是,如果我尝试添加另一个语句,编译器会抱怨:
firstly {
// ...
}.then { obj in
self.handleResult(obj)
self.doSomethingDifferent(obj)
}.catch { error in // compiler error: Missing return in a closure expected to return 'AnyPromise'
self.handleError(error)
}
显然,解决方案是返回另一个承诺,但它在终端块中没有意义。还有什么我可以做的吗?
答案 0 :(得分:19)
根据http://promisekit.org/PromiseKit-2.0-Released/,在 Swift编译器问题部分下:
Swift编译器经常会出错。弄清楚 问题,首先尝试为您的闭包指定完整签名:
foo.then { x in
doh()
return bar()
}
// will need to be written as:
foo.then { obj -> Promise<Type> in
doh()
return bar()
}
// Because the Swift compiler cannot infer closure types very
// well yet. We hope this will be fixed.
// Watch out for one-line closures though! Swift will
// automatically infer the types, which may confuse you:
foo.then {
return bar()
}
因此,您必须将代码更改为:
firstly {
// ...
}.then { obj -> Promise<WhateverTypeDoSomethingDifferentPromises> in
self.handleResult(obj)
self.doSomethingDifferent(obj)
}.catch { error in
self.handleError(error)
}
或者您可以使用obj -> Void
来停止链
答案 1 :(得分:4)
将其更改为:
firstly {
// ...
}.then { obj -> Void in
self.handleResult(obj)
self.doSomethingDifferent(obj)
}.catch { error in
self.handleError(error)
}
答案 2 :(得分:0)
在Swift 5.1版中,您可以使用Combine Framework来做到这一点,可以使用Future模式来解决此问题。这与Promise使用的东西相同。您的代码将如下所示:
final class Future<Output, Failure> where Failure : Error
所以只是警告您有关Swift和新框架中的承诺。
答案 3 :(得分:0)
如果您不想继续使用done
进行链接,请在PromiseKit 6.10.0中使用then
而不是Thenable
:
firstly {
// ...
}.done { obj in
self.handleResult(obj)
self.doSomethingDifferent(obj)
}.catch { error in
self.handleError(error)
}