代码之家  ›  专栏  ›  技术社区  ›  7ball

在PromiseKit 6中返回无效

  •  8
  • 7ball  · 技术社区  · 7 年前

    这就是我在PromiseKit 4.5中所做的

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

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

    这个错误消息对我来说没有什么意义。如何修复此问题?

    编辑:这似乎可以解决问题,但我不太了解这会发生什么:

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

    现在有什么区别 then() compactMap() ?

    1 回复  |  直到 7 年前
        1
  •  12
  •   Ihar Katkavets    7 年前

    符合 PromiseKit 6.0 Guide then 被拆分为 然后 ,则, done map

    • 然后 输入以前的承诺值,并要求您返回一个承诺。
    • 完成 输入之前的承诺值并返回无效承诺(这是链使用量的80%)
    • 地图 输入以前的承诺值,并要求您返回非承诺值,即值。

    为什么会这样?正如开发商所言:

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

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

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

    查看更多信息 release guide

    压缩映射 已重命名为 flatMap see discussions here