使用Swift的PromiseKit:终止承诺链

And*_*nko 9 swift promisekit

我正在尝试将PromiseKit与Swift一起使用.我对它并不熟悉,似乎没有太多关于它与Swift一起使用的信息.

我似乎无法弄清楚如何终止一连串的承诺.只要最后一个(终端)then块包含单个语句,一切都很好:

firstly {
    // ...
}.then { obj in
    self.handleResult(obj)
}.catch { error in
    self.handleError(error)
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试添加另一个语句,编译器会抱怨:

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)
}
Run Code Online (Sandbox Code Playgroud)

显然,解决方案是返回另一个承诺,但它在终端块中没有意义.还有什么我可以做的吗?

Soh*_*ian 20

根据http://promisekit.org/PromiseKit-2.0-Released/,在Swift Compiler Issues部分下:

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()
}
Run Code Online (Sandbox Code Playgroud)

因此,您必须将代码更改为:

firstly {
    // ...
}.then { obj -> Promise<WhateverTypeDoSomethingDifferentPromises> in
    self.handleResult(obj)
    self.doSomethingDifferent(obj)
}.catch { error in
    self.handleError(error)
}
Run Code Online (Sandbox Code Playgroud)

或者你可以obj -> Void用来阻止链条

  • _或者你可以使用`obj - > Void`来阻止链_ - 是的,这正是我所需要的.谢谢. (3认同)