示例代碼
Promise.all([runAsync1(), runAsync2(), runAsync3()]).then(function(results){
console.log(results);
});
promise.all接受一個數(shù)組作為參數(shù),數(shù)組里的每個元素都返回一個promise。
等到數(shù)組中的每個promise都完成(resolve或reject)后,才會執(zhí)行then方法。
而每個promise的返回都會在then的參數(shù)results中。
是吧,用法很簡單,使用的業(yè)務(wù)場景也很常見
- 比如我們需要上傳100張圖片,等100個全部上傳完之后再進(jìn)一步解析圖片
- 比如在頁面加載時,需要先下載完各種資源,再進(jìn)行頁面的初始化
但是
問題一、
promise.all是并行的嗎,它在javascript的事件機(jī)制里到底是怎么執(zhí)行的呢?
這是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實例的執(zhí)行結(jié)果緩存到resolutions數(shù)組中
values[index] = x;
};
}
var i = 0;
for (var value of iterable) {
//把傳入的參數(shù)用promise.resolve轉(zhuǎn)化為Promise對象實例
var nextPromise = this.resolve(value);
//轉(zhuǎn)換完成后調(diào)用then方法執(zhí)行
nextPromise.then(
CreateResolveElementFunction(i, resolutions, deferred),
deferred.reject);
++i;
}
return deferred.promise;
}