Q.all() 和 Promise.prototype.all() 方法有什么区别?

Wht is the difference between Q.all() and Promise.prototype.all() methods?

我试图了解 promises 是如何工作的,所以总体思路很清楚,但目前我仍然坚持使用 all() 方法。我知道,它曾经对一系列其他承诺做出承诺,当数组中的所有承诺都将得到解决时,这些承诺将得到解决,或者当数组中的任何承诺被拒绝时,这些承诺将被拒绝。这是我的代码片段:

var qu = require('q');
var proArr = [];

for(var i = 0; i < 4; i++) {
    var tmpDef = qu.defer();

    (function(index, tmpDef) {
        setTimeout(function() {
            console.log('Timeout ' + index + ' has triggered!');
            tmpDef.resolve();
        }, (i + 1) * 1000);
        proArr.push(tmpDef.promise);
    })(i, tmpDef);
}

qu.all(proArr).then(function() { 
    console.log('All timeouts has passed with Q.all()!');
    return 'some result';
});
qu.defer().promise.all(proArr).then(function() { 
    console.log('All timeouts has passed with promise.all()!');
    return 'some result';
});

对于此代码段,由 qu.all() 方法返回的承诺将在触发所有超时时得到解决,但由 qu.defer().promise.all() 方法返回的承诺将保持挂起状态,即使所有超时都将被触发。那么 Promise.prototype.all() 方法有什么用呢?它与 Q.all() 方法有何不同?

我还查看了 Q 库源代码,这里是 Promise.prototype.all() 方法的代码:

Promise.prototype.all = function () {
    return all(this);
};

据我所知,此方法调用 Q.all() 时将当前 promise 的实例作为参数,但为什么呢? Q.all() 方法不是必须接受一系列承诺吗?因此,非常感谢您澄清所有这些时刻。

Don't the method Q.all() have to accept an array of promises?

不,事实上 Q.all 方法也可以对一个 promise 数组进行 promise。您可以在输入中看到 in the code well, it does call Q.when。这可能看起来有点无用,但它更宽容 API 并且显然简化了 Promise.prototype.all.

的实现

What is the difference between Q.all() and Promise.prototype.all()?

让我们回到更简单的心智模型。 Q.all 是一个静态函数,它接受一个承诺数组,returns 你对一个包含所有结果的数组的承诺。

.all原型方法简单方便。而不是写

….then(Q.all).…

你可以使用

….all().…

在 promise 链中 - 这些是完全等价的。请注意,.all 原型方法不接受任何参数 - 它确实从调用它的承诺中获取数组。

a promise, which returned by Q.defer().promise.all(proArr) method will stay in pending state even if all timeouts will be triggered

是的。这有两个原因:

  • Q.defer().promise 是一个永远不会解决的承诺(并且由于您已经丢弃了延迟的,所以您永远不会解决)。该链甚至没有推进到 .all(…) 调用。
  • 如上所述,您在此处调用的原型方法不接受任何参数。 proArr 被简单地忽略了。

如果你想使用它,你可以使用以下方法:

Q(proArr).all().…