从另一个承诺返回承诺的理由?

时间:2015-09-19 18:50:30

标签: javascript angularjs promise

在以下代码中,从successerr方法返回另一个承诺的原因是什么?如您所见,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;
};

2 个答案:

答案 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