我有一些功能,
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
它們是異步函式,回傳一些承諾。現在有一個場景,比如我有一個引數陣列,這些引數在每次迭代時傳遞給 `firstFunction,它應該遵循相同的執行流程。像這樣的東西:
const results = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameters)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
那么我怎樣才能更有效地實作這一目標呢?我可以想象的有效解決方案之一是執行firstFunction第一個parameter,開始執行secondFunction,直到兌現承諾,然后secondFunction開始執行firstFunction的下一次迭代arrayOfParameters。有什么辦法可以實作這一目標嗎?Promise.all如果整個回圈要同步執行,似乎不值得。
uj5u.com熱心網友回復:
您的代碼已經設定為執行此操作。
它將從運行陣列元素 0 的映射代碼開始。它同步呼叫firstFunction但隨后命中await,因此映射函式回傳一個承諾。這個承諾被放在 的元素 0 中results。然后它對元素 1 做同樣的事情,然后是 2 等等。所以它會呼叫firstFunction陣列的每個元素,并將一個承諾陣列分配給results,但它們都不會阻塞或等待。
現在已經創建了 promise 陣列,因此代碼繼續執行此行之后的任何內容。隨著時間的推移,對 的呼叫firstFunction將開始完成,async函式將繼續呼叫secondFunction陣列的每個元素(不一定以完全相同的順序,因為這是在不可預測的時間發生的)。然后最終他們都會做第三個功能,最后他們會解決他們對finalResult.
因此,您的代碼中唯一缺少的是知道何時完成,為此您需要Promise.all:
const promises = arrayOfParamters.map(async parameter => {
const firstResult = await firstFunction(parameter)
const secondResult = await secondFunction(firstResult)
const finalResult = await finalFunction(secondResult)
return finalResult
})
const results = await Promise.all(promises)
uj5u.com熱心網友回復:
因為Promise.then將結果作為引數鏈接到下一個函式,所以您可以使用它而不是async await
你可以這樣使用Promise.all:
const promiseChain = arrayOfParamters.map((parameter) => firstFunction(parameter).then(secondFunction).then(finalFunction));
const results = await Promise.all(promiseChain);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/323493.html
標籤:javascript 节点.js 异步 承诺
