PromiseKit 分支承诺

Posted

技术标签:

【中文标题】PromiseKit 分支承诺【英文标题】:PromiseKit branching promise 【发布时间】:2016-05-13 02:02:47 【问题描述】:

假设你的 Promise 链中有一个可以不返回任何内容或 AnyObject 承诺的分支。你会指定什么作为'then'闭包的返回类型?例如:

func sample() -> Promise<AnyObject> 
    return Promise  fulfill, reject in
        fulfill(1)
    
    .then  _ -> Void in
        if false 
            return Promise  fulfill, reject in
                fulfill(0)
            
        
    

如果我将 Void 作为“then”闭包的返回类型,则会出现段错误;如果我将 Promise 作为返回类型,则会出现错误:

missing return in a closure expected to return Promise<AnyObject>

有什么建议吗?

谢谢

【问题讨论】:

如果你使用Promise作为返回类型,你必须返回一个Promise。现在你只能从 if false 内部执行此操作,它永远不会被执行。 如果我改成func sample() -&gt; Promise&lt;AnyObject&gt; return Promise fulfill, reject in fulfill(1) .then _ -&gt; Void in debugPrint("foo") .then _ -&gt; Promise&lt;AnyObject&gt; in if false return Promise fulfill, reject in fulfill(0) return Promise fulfill, reject in fulfill(0) 就可以了;但我必须明确返回一个空洞的承诺似乎有点蹩脚@jtbandes 你的目标是什么?为什么会有这个if false 分支? 只是为了澄清闭包可以返回 void 或解析为某个对象的承诺;我不清楚 PromiseKit 的“then”方法的实现以及它在引擎盖下的作用@jtbandes 尝试返回一个可选的? 【参考方案1】:

根据代码示例,我认为没有理由返回 AnyObject。如果你想有选择地返回 Void 或 Object,那么做一个包含可选的 promise。

func sample() -> Promise<AnyObject?> 
    return Promise  fulfill, reject in
        functionForGettingObjectWithCallback()  result: AnyObject? in
            fulfill(result)
        
    

【讨论】:

以上是关于PromiseKit 分支承诺的主要内容,如果未能解决你的问题,请参考以下文章

返回使用另一个 PromiseKit 承诺的承诺

如何使用 PromiseKit 重构快速回调以承诺

带有可选承诺的 PromiseKit

PromiseKit 2.0:链接承诺不传递参数

PromiseKit - 带有重新加载第一个承诺的可选承诺

自己的 Promisekit 承诺没有正确响应