10

我正在尝试将 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)
}

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

4

4 回答 4

21

根据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停止链条

于 2015-07-17T20:27:49.453 回答
4

将其更改为:

firstly {
    // ...
}.then { obj -> Void in
    self.handleResult(obj)
    self.doSomethingDifferent(obj)
}.catch { error in
    self.handleError(error)
}
于 2016-05-16T13:15:42.583 回答
0

在 PromiseKit 6.10.0done中,then如果您不想继续链,请使用Thenable

firstly {
    // ...
}.done { obj in
    self.handleResult(obj)
    self.doSomethingDifferent(obj)
}.catch { error in
    self.handleError(error)
}
于 2019-08-12T12:53:29.983 回答
-2

在 Swift 5.1 版本中,您可以使用 Combine Framework 来解决此问题,您可以使用模式 Future。这与 Promise 使用的相同。您的代码将如下所示:

final class Future<Output, Failure> where Failure : Error

所以只是为了警告你关于 Swift 和新框架中的承诺。

于 2019-08-12T11:24:56.673 回答