示例代码
Promise.all([runAsync1(), runAsync2(), runAsync3()]).then(function(results){
console.log(results);
});
promise.all接受一个数组作为参数,数组里的每个元素都返回一个promise。
等到数组中的每个promise都完成(resolve或reject)后,才会执行then方法。
而每个promise的返回都会在then的参数results中。
是吧,用法很简单,使用的业务场景也很常见
- 比如我们需要上传100张图片,等100个全部上传完之后再进一步解析图片
- 比如在页面加载时,需要先下载完各种资源,再进行页面的初始化
但是
问题一、
promise.all是并行的吗,它在javascript的事件机制里到底是怎么执行的呢?
这是promise.all的源码:
function PromiseAll(iterable) {
var deferred = NewPromiseCapability(this);
var resolutions = new InternalArray();
function CreateResolveElementFunction(index, values, promiseCapability) {
var alreadyCalled = false;
return (x) => {
if (alreadyCalled === true) return;
alreadyCalled = true;
//把这个promise实例的执行结果缓存到resolutions数组中
values[index] = x;
};
}
var i = 0;
for (var value of iterable) {
//把传入的参数用promise.resolve转化为Promise对象实例
var nextPromise = this.resolve(value);
//转换完成后调用then方法执行
nextPromise.then(
CreateResolveElementFunction(i, resolutions, deferred),
deferred.reject);
++i;
}
return deferred.promise;
}