Xcode 中奇怪的 promiseKit 6 语法行为

Odd promiseKit 6 syntax behavior in Xcode

我开始使用 PromiseKit 以防止自己编写具有 10 级回调的函数..

我使用 CocoaPods 安装了最新版本 (6.2.4),运行 是 xCode 的最新版本,在我试图让它工作的文件中导入了 PromiseKit,但我得到 Xcode 的非常奇怪的行为,导致几个错误。

我打算做一些非常基础的事情来开始:

下面的函数为我正在开发的产品概览应用程序中的产品类别创建过滤器 (ProductListComponents)。

func createCategoryComponents(masterComponent: MasterComponent?) -> Promise<[ProductListComponents]> {
    return Promise { seal in
        //create a bunch of product category components
        seal.resolve([components])
    }
}

一切都很好。然后我试着得到这个:

firstly {
    self.createCategoryComponents(masterComponent: masterComponent)
}.then { createdComponents in
    completion.resolve(nil, createdComponents)
}

这无法正常工作。首先,当我尝试输入 firstly 代码时,Xcode 建议:

firstly(execute: { () -> Guarantee<T> in
    //code
})

和:

firstly(execute: { () -> Thenable in
    //code
})

我在任何 PromiseKit 文档中都没有看到这种语法。它还建议使用奇怪的语法,例如.then 调用。当接受 Xcode 的建议时,它显然会显示错误,因为这不是正确的 PromiseKit 语法。当忽略 Xcode 的建议时,我得到这个:

显然这里出了点问题,我最好的猜测是 PromiseKit 的安装出了问题。我清理了我的项目,重新安装了 pod,重新启动 Xcode 但似乎没有任何效果。

问题

有谁知道我在这里遇到了什么样的问题,更重要的是,我该如何解决它?

任何帮助将不胜感激。

根据 release notes:

  • then is fed the previous promise value and requires you return a promise.
  • done is fed the previous promise value and returns a Void promise (which is 80% of chain usage)
  • map is fed the previous promise value and requires you return a non-promise, ie. a value.

因此,then 不应该在这里工作,因为您需要 return 承诺值。如果您只是将 then 更改为 done 它将起作用。

还有一些建议。

  • firstly 实际上是关于视觉装饰的(我相信它在 PMK 文档的某个地方,但我现在找不到它),所以,如果这让你感到困惑,请尝试首先删除它;
  • PMK 的主要特点是 chain。你绝对应该按照这个原则来写你的代码;
  • 此外,不要忘记错误。为此,在链的末尾使用 catch

您的代码的最终示例:

firstly {
    self.createCategoryComponents(masterComponent: masterComponent)
}
.done { createdComponents in
    completion.resolve(nil, createdComponents)
}
.catch { error in
    // don't forget about errors
}