这是我使用PromiseKit 4.5
的原因api.getUserFirstName().then { name -> Void in
print(name)
}
getUserFirstName()
返回Promsise<String>
。我更新到PromiseKit 6,现在抛出一个错误:
Cannot convert value of type '(_) -> Void' to expected argument type '(_) -> _'
此错误消息对我来说没什么意义。我该如何解决这个问题?
编辑:所以这似乎解决了这个问题,但我对此发生的事情几乎一无所知:
api.getUserFirstName().compactMap { name in
print(name)
}
then()
和compactMap()
之间有什么区别?
答案 0 :(得分:6)
根据PromiseKit 6.0 Guide then
,被分为then
,done
和map
then
已提供先前的承诺值,并要求您返回承诺。done
被提供前一个承诺值并返回一个Void承诺(占链使用量的80%)map
被提供前一个承诺值并要求您返回一个非承诺,即。价值。为什么会这样?正如开发人员所说:
使用PromiseKit我们的
then
做了很多事情,我们依靠Swift从上下文中推断出正确的then
。但是如果使用多行then
,它将无法执行此操作,而不是告诉您情况不明确,它会发明一些其他错误。经常是可怕的cannot convert T to AnyPromise
。我们有一个故障排除指南来解决这个问题,但我相信工具只是工作,当你花了4年时间等待Swift解决问题而Swift没有解决问题时,你会怎么做?我们选择在更高层次上找到解决方案。
因此,您可能需要使用done
func stackOverflowExample() {
self.getUserFirstName().done { name -> Void in
print(name)
}
}
func getUserFirstName() -> Promise<String> {
return .value("My User")
}
compactMap
可让您在返回nil时获得错误传输。
firstly {
URLSession.shared.dataTask(.promise, with: url)
}.compactMap {
try JSONDecoder().decode(Foo.self, with: $0.data)
}.done {
//…
}.catch {
// though probably you should return without the `catch`
}
查看更多信息
compactMap
已重命名为flatMap
see discussions here