Q.allSettled会失败吗?

问题描述 投票:3回答:1

我已经在单元测试中看到了一些函数,其中函数从函数调用返回q.allSettled()承诺,并且有一个附加到promise的.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的例子吗?

node.js promise q
1个回答
5
投票

Q.allSettled不能失败。见Q API

返回使用一组承诺状态快照实现的承诺,但仅在所有原始承诺已经解决后,即变为满足或拒绝。

很明显,无论allSettled的任何承诺,你仍然会得到一个解决的承诺。

在您的特定情况下,.then声明可能会失败,因为例如以下行

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

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

© www.soinside.com 2019 - 2024. All rights reserved.