swift - PromiseKit:无法在 then 处理程序之间调用自定义代码
问题描述
刚开始使用 PromiseKit 并遇到了一个奇怪的编译问题:
- with first: 对成员'firstly(execute:)' () 的模糊引用
- without 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
...
}
解决方案
我最近一直在使用 Promises,并且遇到了类似的错误,似乎有时所有的闭包和泛型都能充分利用编译器。
我发现如果你有电话,你应该总是有电话,在. 意味着您将不再链接您的承诺,然后您可以使用 a ,就像电话一样。done
catch
catch
done
PKFinalizer
catch
如果你的 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
...
}
推荐阅读
- ruby-on-rails - Redmine JSON.parse 导致内部错误
- java - 异常:SparkException:任务不可序列化
- html - 下拉菜单显示在 li 的右侧而不是下方
- javascript - React js material-ui 自动完成从renderInput中取出选中的元素并切换到textfield的InputProps
- triggers - 如何触发 Apache Camel 中的现有路由?
- http - curl: (55) 发送 HTTP POST 请求失败
- php - Ajax Jquery 表单提交
- arrays - Swift 从数组中获取 x 个元素
- python - 使用“in”运算符在 pd.Series 中查找元素不正确?
- apache-kafka - 如何将数据添加到 Apache Kafka 的分区中?