【问题标题】:Does Q.allSettled ever fail?Q.allSettled 会失败吗?
【发布时间】:2016-08-20 17:21:39
【问题描述】:

我在单元测试中看到了一些地方,其中函数从函数调用返回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 的示例?

【问题讨论】:

  • 我没有查看源代码,但可以想象如果你不传入数组/可迭代或类似的东西它会失败。
  • @Bergi,不,它只是用一个空数组调用.then

标签: node.js promise q


【解决方案1】:

您可能需要考虑两件事:

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

【讨论】:

    【解决方案2】:

    Q.allSettled 不会失败。见Q API 上面写着

    返回一个通过一系列承诺状态实现的承诺 快照,但只有在所有原始承诺都已解决之后,即 要么满足要么被拒绝。

    这很清楚,无论allSettled 中的承诺是什么,你仍然会得到一个已解决的承诺。

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

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

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

    【讨论】:

    • 所以,重申一下您的意思,.allSettled 本身不会失败,但如果 .then 中的某些内容引发未处理的异常,则 .fail 将被触发。
    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多