3 回答

TA貢獻1812條經驗 獲得超5個贊
forEach在這種情況下可能有點棘手,您可以簡單地使用for循環,因為它們不會跳轉到下一個項目,直到所有承諾都沒有解決
for(i =0; i < entity.length; i++)
{
let dataItem = entity[i]
for(j =0; j < userParams.length; j++)
{
let userParamItem = userParams[i]
const Marks = await _fetchMark(req, dataItem.MKTUNITID);
//do some manipulation to Marks
}
}

TA貢獻1794條經驗 獲得超7個贊
每當我必須在 forEach(或任何迭代器循環;for、while、數組方法)中使用等待時,我喜歡創建一個小數組來存儲所做的承諾。
我會打出一個例子。我有一個 10 個 url 的列表,我想對其進行提取,并在運行之前存儲結果doSomething()。我的runFetch()-function 是異步的,因此默認情況下(除非我等待它)返回一個承諾。迭代之后,我會同時等待所有的承諾,所以他們可以并行運行,但仍然等待最慢的承諾。
const urls = [...] // my urls
const promises = []
for (const url of urls) {
promises.push( runFetch(url) )
}
const results = await Promise.all(promises)
//now that all my fetches are done, I can continue.
doSomething()

TA貢獻1895條經驗 獲得超7個贊
Javascript 這樣做是因為 forEach 不是承諾感知的。它不支持異步和等待,因此您不能在 forEach 中使用等待。相反,使用for...of循環:
for(const dataItem of entity) {
for(const userParamItem of userParams) {
const Marks = await _fetchMark(req, dataItem.MKTUNITID);
//do some manipulation to Marks
}
}
});
doSomething();
這樣嵌套循環將首先和doSomething()最后執行。
如果您想了解更多信息,這是一篇不錯的帖子: https ://zellwk.com/blog/async-await-in-loops/
添加回答
舉報