在以下代码中,从success
或err
方法返回另一个承诺的原因是什么?如您所见,someFunction
已经返回一个承诺,我们可以轻松地将其返回给调用者。
我不理解在我们不装饰/操纵响应或错误时做出另一个承诺的原因。是否有一个我不知道的用例?
function() {
var p = $q.defer();
someModule.someFunction(input)
.then(
function(success) {
return p.resolve(success);
},
function(err) {
return p.reject(err)
}
);
return p.promise;
};
答案 0 :(得分:3)
这整件事可以替换为:
function someFunc() {
return someModule.someFunction(input);
}
创建自己的承诺被认为是一种反模式,然后当你可以使用已经存在的承诺时,你可以解决并拒绝。
它被认为是一种反模式,它具有无操作成功和错误处理程序,基本上只能执行默认行为。
实际上,您的代码片段与直接返回promise的唯一不同之处在于它确保返回的promise是Q promise,而不是任何类型的promise .someFunction()
返回。但是,如果这是一个要求,那么它可以在没有所有额外代码的情况下更直接地转换为Q承诺。
这是一个值得避免的discussion of promise anti-patterns因为有更好的方法。
答案 1 :(得分:3)
您没有理由在您的情况下使用延期承诺。事实上,使用延迟是使用promises时最常见的反模式之一,只应在非常特殊的情况下使用。
在延迟反模式中,"延迟"对象是无缘无故创建的,使代码复杂化。
这种多余的包装也很危险,任何类型的错误和 吞噬拒绝并且不会传播给此呼叫者 功能
代替使用Deferred反模式,代码应该简单 返回它已经拥有的promise并使用return
传播值
快速阅读蓝鸟(最好的承诺图书馆之一)文档,其中讨论了这个主题https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern