Q.all()和Promise.prototype.all()方法的区别是什么?
Wht is the difference between Q.all() and Promise.prototype.all() methods?
我试图理解承诺是如何工作的,所以一般的想法是相当清楚的,但目前我被困在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().…
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在ember/handlers中使用value和valueBinding有什么区别
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- Nested Q.all nodejs
- Bootstrap Dropdown selection是在*all*下拉菜单上设置选择
- javascript函数的:和=之间的区别
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- 当一些承诺失败时,如何继续使用$q.all()
- Math.min()和Math.max()之间有什么区别?在Javascript中
- angularjs中的ng网格和ui网格有什么区别
- 使用大括号和不使用bracs调用函数的区别
- webpack开发模式和生产构建模式之间有什么区别
- 使用Rhino和ASE执行Javascript的区别
- servlet和代理servlet之间的区别
- 什么'Angular2-all.umd.js和Angular2.js之间的区别
- Rails 4-区别//=需要jquery.ui.all或使用CDN