Promise.all

示例代碼

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文適用的讀者 本文寫給有一定Promise使用經(jīng)驗的人,如果你還沒有使用過Promise,這篇文章可能不適合你,...
    HZ充電大喵閱讀 7,457評論 6 19
  • 00、前言Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)...
    夜幕小草閱讀 2,227評論 0 12
  • Promiese 簡單說就是一個容器,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果,語法上說,Pr...
    雨飛飛雨閱讀 3,491評論 0 19
  • 工作,心里有些空蕩,仔細(xì)想來,不是和朋友家人交流的需要,而是創(chuàng)作的需要:很需要畫幅畫,很需要寫段話,很需要唱首歌,...
    謝慈玲閱讀 262評論 0 0
  • 暑假到了,除了作業(yè)我還去了學(xué)習(xí)班,除了學(xué)習(xí)之外,嘿嘿,我還經(jīng)常玩手機(jī)。每天,我都會玩到很晚。第二天起床我很難受,媽...
    趙旋汝閱讀 667評論 0 5

友情鏈接更多精彩內(nèi)容