3 回答

TA貢獻2016條經(jīng)驗 獲得超9個贊
正在Promise.all(iterable)執(zhí)行的所有承諾?
不,諾言不能“被執(zhí)行”。它們在創(chuàng)建時就開始執(zhí)行任務-它們僅代表結果-并且您在并行執(zhí)行所有操作之前甚至將其傳遞給它們Promise.all。
Promise.all只會等待多個承諾。它不在乎它們以什么順序解析,也不管計算是否并行運行。
是否有一種方便的方法來依次運行迭代?
如果您已經(jīng)有了承諾,那么您將無能為力,但是Promise.all([p1, p2, p3, …])(沒有順序的概念)。但是,如果您確實具有可迭代的異步函數(shù),則實際上可以按順序運行它們?;旧夏阈枰獜?/p>
[fn1, fn2, fn3, …]
至
fn1().then(fn2).then(fn3).then(…)
解決此問題的方法是使用Array::reduce:
iterable.reduce((p, fn) => p.then(fn), Promise.resolve())

TA貢獻1943條經(jīng)驗 獲得超7個贊
在平行下
await Promise.all(items.map(async item => { await fetchItem(item) }))
優(yōu)點:更快。即使一次迭代失敗,也將執(zhí)行所有迭代。
按順序
for (let i = 0; i < items.length; i++) {
await fetchItem(items[i])
}
優(yōu)點:循環(huán)中的變量可以由每次迭代共享。行為類似于普通的命令式同步代碼。

TA貢獻1895條經(jīng)驗 獲得超3個贊
Bergis的答案使用Array.reduce使我走上了正確的軌道。
但是,要使函數(shù)真正返回我的諾言,一個接一個地執(zhí)行,我必須添加一些嵌套。
我的實際用例是由于下游限制而需要依次傳輸?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);
});
如先前的答案所示,請使用:
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);
});
在開始另一個文件傳輸之前沒有等待傳輸完成,甚至在開始第一個文件傳輸之前就出現(xiàn)了“已傳輸所有文件”文本。
不知道我做錯了什么,但想分享對我有用的東西。
編輯:自從我寫了這篇文章后,我現(xiàn)在了解了為什么第一個版本不起作用。then()期望一個函數(shù)返回一個promise。因此,您應該傳遞不帶括號的函數(shù)名稱!現(xiàn)在,我的函數(shù)需要一個參數(shù),因此我需要包裝成不帶參數(shù)的匿名函數(shù)!
添加回答
舉報