Q.allSettled会失败吗?

时间:2016-04-26 17:58:45

标签: node.js promise q

我已经在单元测试中看到了一些函数,函数在函数调用中返回q.allSettled()承诺,并且附加了承诺的.fail。但即使某些/所有承诺被拒绝,.allSettled也会调用.then

以下是一个例子:

function someFunctionToTest(){
  var aRejectedDeferred = Q.defer();
  var anotherRejectedDeferred = Q.defer();
  var aResolvedDeferred = Q.defer();

  aRejectedDeferred.reject(new Error("I'm aRejectedPromise"));
  anotherRejectedDeferred.reject(new Error("I'm anotherRejectedPromise"));
  aResolvedDeferred.resolve({awesome:"I'm aResolvedPromise"});

  return Q.allSettled([aRejectedDeferred.promise,anotherRejectedDeferred.promise, aResolvedDeferred.promise])
}

it('should never fail', function(done) {

  someFunctionToTest()
      .then(function (data) {
        should.equal(data[0].state,'rejected');
        should.equal(data[1].state,'rejected');
        should.equal(data[2].state,'fulfilled');
        // throw(new Error('I will trigger fail!!!'));
        done();
      })
      .fail(function (err) {
        done(err);
      });
});

您能提供一些可以触发.fail的示例吗?

2 个答案:

答案 0 :(得分:5)

Q.allSettled不能失败。请参阅Q API,其中包含

  

返回使用promise状态数组实现的promise   快照,但只有在所有原始承诺已经解决之后,即   成就或被拒绝。

很明显,allSettled中的任何承诺都会得到解决的承诺。

在您的特定情况下,.then语句可能会失败,例如以下一行

should.equal(data[0].state,'rejected');

这可能抛出一个断言异常,导致失败,你可以捕获它并运行done();,这是对测试工具说异步请求已经完成的方式。但这只是猜测。 Q.allSettled本身不会失败。

答案 1 :(得分:0)

您可能要考虑两件事:

  1. Q.allSettled没有fail函数,它仅与以承诺状态作为参数的done()一起使用。您应该检查这些状态以查看诺言是fulfilled还是rejected。但是Q.all有一个then和一个fail函数,您可能想使用,但不会将任何参数传递给then,因此不会知道任何状态。
  2. 如果您在每个promise中手动捕获错误(即为每个promise实现fail()函数),则状态将始终为fullfiled,因此在使用Q.allQ.allSettled,要么不捕获承诺中的错误,要么在捕获后再次抛出它们!