【问题标题】:PromiseKit: can't call custom code between then handlersPromiseKit:无法在 then 处理程序之间调用自定义代码
【发布时间】:2019-03-22 23:07:53
【问题描述】:

刚开始使用 PromiseKit 并遇到了一个奇怪的问题 编译问题:

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

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

承诺

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

【问题讨论】:

    标签: swift promisekit


    【解决方案1】:

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

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

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

    编辑:

    这周我也遇到了一个错误,在闭包中添加额外的行会导致它失败。因为我所做的是将一个承诺转换为多个承诺,所以我使用了flatMapThenPromise 上有几种方法可以用于不同的结果。如果你想存储 Promise 的结果并继续,你可以使用 get,如果你想将结果转换为另一种类型,可以使用 map。

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

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

    【讨论】:

    • 我听从了您的建议,但上面的示例仍然无法编译。 :(
    • @Markus 我在回答中添加了更多信息
    • 谢谢!这是一个很棒的工作,我花了整个下午试图让它工作,应该早点发布;)
    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2016-02-02
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多