在PromiseKit 6中返回void

这就是我使用PromiseKit 4.5的原因

api.getUserFirstName().then { name -> Void in print(name) } 

getUserFirstName()返回Promsise 。 我更新到PromiseKit 6,现在抛出一个错误: Cannot convert value of type '(_) -> Void' to expected argument type '(_) -> _'

此错误消息对我来说没什么意义。 我该如何解决?

编辑:所以这似乎解决了它,但我对这发生了什么没有什么了解:

 api.getUserFirstName().compactMap { name in print(name) } 

那么then()compactMap()之间有什么区别?

根据PromiseKit 6.0指南, then被拆分为thendonemap

  • then输入先前的承诺值并要求您返回承诺。
  • done前一个承诺值并返回一个Void承诺(这是链使用的80%)
  • map是前一个promise值,需要你返回一个非promise,即。 一个值。

为什么会这样? 正如开发者所说:

使用PromiseKit,我们做了很多事情,我们依靠Swift从上下文中推断出正确的。 然而,如果使用多行, then无法执行此操作,而不是告诉您情况不明确,它会发明一些其他错误。 通常,可怕的cannot convert T to AnyPromise 。 我们有一个故障排除指南来解决这个问题,但我相信只有工作的工具,当你花了4年时间等待Swift解决问题而Swift没有解决问题时,你会怎么做? 我们选择在更高层次上找到解决方案。

所以可能在你的情况下需要使用done

 func stackOverflowExample() { self.getUserFirstName().done { name -> Void in print(name) } } func getUserFirstName() -> Promise { 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 请参阅此处的讨论