第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Node.js本機(jī)Promise.all是并行還是順序處理?

Node.js本機(jī)Promise.all是并行還是順序處理?

喵喔喔 2019-12-12 14:40:37
我想澄清這一點(diǎn),因?yàn)槲臋n對(duì)此不太清楚。問(wèn)題1:是Promise.all(iterable)按順序還是并行處理所有承諾?或者,更具體地說(shuō),它相當(dāng)于運(yùn)行像p1.then(p2).then(p3).then(p4).then(p5)....或者是一些其他類(lèi)型的算法的所有p1,p2,p3,p4,p5,等是被稱為在同一時(shí)間(并行)和結(jié)果盡快返回所有的決心(或一個(gè)不合格品)?問(wèn)題2:如果Promise.all并行運(yùn)行,是否有一種方便的方法可以依次運(yùn)行可迭代程序?注意:我不想使用Q或Bluebird,而是要使用所有本機(jī)ES6規(guī)范。
查看完整描述

3 回答

?
慕沐林林

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊

正在Promise.all(iterable)執(zhí)行的所有承諾?


不,諾言不能“被執(zhí)行”。它們?cè)趧?chuàng)建時(shí)就開(kāi)始執(zhí)行任務(wù)-它們僅代表結(jié)果-并且您在并行執(zhí)行所有操作之前甚至將其傳遞給它們Promise.all。


Promise.all只會(huì)等待多個(gè)承諾。它不在乎它們以什么順序解析,也不管計(jì)算是否并行運(yùn)行。


是否有一種方便的方法來(lái)依次運(yùn)行迭代?


如果您已經(jīng)有了承諾,那么您將無(wú)能為力,但是Promise.all([p1, p2, p3, …])(沒(méi)有順序的概念)。但是,如果您確實(shí)具有可迭代的異步函數(shù),則實(shí)際上可以按順序運(yùn)行它們?;旧夏阈枰獜?/p>


[fn1, fn2, fn3, …]


fn1().then(fn2).then(fn3).then(…)

解決此問(wèn)題的方法是使用Array::reduce:


iterable.reduce((p, fn) => p.then(fn), Promise.resolve())


查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊

在平行下

await Promise.all(items.map(async item => { await fetchItem(item) }))

優(yōu)點(diǎn):更快。即使一次迭代失敗,也將執(zhí)行所有迭代。


按順序

for (let i = 0; i < items.length; i++) {

    await fetchItem(items[i])

}

優(yōu)點(diǎn):循環(huán)中的變量可以由每次迭代共享。行為類(lèi)似于普通的命令式同步代碼。


查看完整回答
反對(duì) 回復(fù) 2019-12-12
?
蠱毒傳說(shuō)

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊

Bergis的答案使用Array.reduce使我走上了正確的軌道。


但是,要使函數(shù)真正返回我的諾言,一個(gè)接一個(gè)地執(zhí)行,我必須添加一些嵌套。


我的實(shí)際用例是由于下游限制而需要依次傳輸?shù)囊幌盗形募?..


這就是我最后得到的。


getAllFiles().then( (files) => {

    return files.reduce((p, theFile) => {

        return p.then(() => {

            return transferFile(theFile); //function returns a promise

        });

    }, Promise.resolve()).then(()=>{

        console.log("All files transferred");

    });

}).catch((error)=>{

    console.log(error);

});

如先前的答案所示,請(qǐng)使用:


getAllFiles().then( (files) => {

    return files.reduce((p, theFile) => {

        return p.then(transferFile(theFile));

    }, Promise.resolve()).then(()=>{

        console.log("All files transferred");

    });

}).catch((error)=>{

    console.log(error);

});

在開(kāi)始另一個(gè)文件傳輸之前沒(méi)有等待傳輸完成,甚至在開(kāi)始第一個(gè)文件傳輸之前就出現(xiàn)了“已傳輸所有文件”文本。


不知道我做錯(cuò)了什么,但想分享對(duì)我有用的東西。


編輯:自從我寫(xiě)了這篇文章后,我現(xiàn)在了解了為什么第一個(gè)版本不起作用。then()期望一個(gè)函數(shù)返回一個(gè)promise。因此,您應(yīng)該傳遞不帶括號(hào)的函數(shù)名稱!現(xiàn)在,我的函數(shù)需要一個(gè)參數(shù),因此我需要包裝成不帶參數(shù)的匿名函數(shù)!


查看完整回答
反對(duì) 回復(fù) 2019-12-12
  • 3 回答
  • 0 關(guān)注
  • 1386 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)