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

PromiseKit: can't call custom code between then handlers

刚开始使用 PromiseKit 并且 运行 进入了一个奇怪的 编译问题:

不确定我做错了什么。

承诺

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
    ...
}

我最近一直在使用 Promises,我 运行 遇到了类似的错误,似乎有时所有的闭包和泛型都得到了编译器的最佳支持。

我发现你应该 总是 有一个 done 电话,如果你有一个 catch 电话,把它添加到 catchdone 意味着您将不再链接您的承诺,然后您可以使用 PKFinalizer,就像 catch 调用一样。

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

编辑:

本周我还遇到了一个错误,即向闭包添加额外的一行使其失败。由于我所做的是将一个承诺转换为多个承诺,因此我使用了 flatMapThenPromise 上有多种方法可用于不同的结果。如果要存储 promise 的结果并继续,可以使用 get,如果要将结果转换为另一种类型,则可以使用 map。

例如,我会把你失败的错误翻译成这个

firstly {
    test(someValue: 2)
}.map {
    1
}.then {
    test(someValue: [=10=])
}.done {
    print("success")
}.catch { error in
    ...
}