首页 > 解决方案 > PromiseKit:无法在 then 处理程序之间调用自定义代码

问题描述

刚开始使用 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
    ...
}

标签: swiftpromisekit

解决方案


我最近一直在使用 Promises,并且遇到了类似的错误,似乎有时所有的闭包和泛型都能充分利用编译器。

我发现如果你有电话,你应该总是有电话,在. 意味着您将不再链接您的承诺,然后您可以使用 a ,就像电话一样。donecatchcatchdonePKFinalizercatch

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

编辑:

本周我也遇到了一个错误,在闭包中添加了额外的行使其失败。由于我所做的是将一个承诺转换为多个承诺,因此我使用了flatMapThen. 有几种方法Promise可以用于不同的结果。如果你想存储 promise 的结果并继续,你可以使用get,或者如果你想将结果转换为另一种类型,则可以使用 map。

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

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

推荐阅读