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

时间:2019-03-22 23:07:53

标签: swift promisekit

只是从PromiseKit开始,然后遇到了一个奇怪的问题 编译问题:

  • with firstly:对成员'firstly(execute :)'()的不明确引用
  • 首先没有:无法推断复杂的闭包返回类型;添加显式

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

承诺

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 个答案:

答案 0 :(得分:1)

我最近已经使用Promises了很多次,并且遇到了类似的错误,似乎有时所有的闭包和泛型都获得了编译器的最佳支持。

我发现,如果您有done呼叫,则应该始终进行catch呼叫,将其添加到catch之前。 done意味着您将不再束缚自己的诺言,然后可以使用PKFinalizer,就像catch调用一样。

如果您的诺言中有您未使用的参数,请确保在下一个_ in / then通话中添加done,或者您可以添加asVoid()在两者之间进行调用,从而丢弃结果。

编辑:

这周,我也遇到了一个错误,即在关闭中添加额外的一行使其失败。由于我所做的是将一个承诺转换为多个承诺,因此我使用了flatMapThenPromise上有几种方法可用于不同的结果。如果要存储来自诺言的结果并继续,则可以使用get,如果要将结果转换为其他类型,可以使用map。

例如,我会将您失败的错误翻译成这样

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