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

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

本文关键字:all 区别 是什么 Promise prototype 方法      更新时间:2023-09-26

我试图理解承诺是如何工作的,所以一般的想法是相当清楚的,但目前我被困在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()与当前承诺的一个实例作为参数,但为什么?方法Q.all()不需要接受承诺数组吗?所以我将非常感谢你澄清所有这些时刻

方法Q.all()不需要接受承诺数组吗?

不,实际上Q.all方法也可以接受promise数组的promise。您可以在代码中看到,它确实在输入时调用了Q.when。这可能看起来有点没用,但它是一个更宽容的API,显然简化了Promise.prototype.all的实现。

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

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

.all原型方法非常方便。而不是写

….then(Q.all).…

可以用

….all().…

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

一个由Q.defer().promise.all(proArr)方法返回的承诺,即使触发所有超时,也将保持pending状态

是的。这有两个原因:

  • Q.defer().promise是一个永远不会解决的承诺(因为你已经扔掉了延迟的,你永远不能)。这个链甚至没有推进到.all(…)调用。
  • 如上所述,您在这里调用的原型方法不接受任何参数。proArr被直接忽略。

如果你想使用它,你可以用下面的方式:

Q(proArr).all().…