3 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
forEach在這種情況下可能有點(diǎn)棘手,您可以簡(jiǎn)單地使用for循環(huán),因?yàn)樗鼈儾粫?huì)跳轉(zhuǎn)到下一個(gè)項(xiàng)目,直到所有承諾都沒(méi)有解決
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貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊
每當(dāng)我必須在 forEach(或任何迭代器循環(huán);for、while、數(shù)組方法)中使用等待時(shí),我喜歡創(chuàng)建一個(gè)小數(shù)組來(lái)存儲(chǔ)所做的承諾。
我會(huì)打出一個(gè)例子。我有一個(gè) 10 個(gè) url 的列表,我想對(duì)其進(jìn)行提取,并在運(yùn)行之前存儲(chǔ)結(jié)果doSomething()。我的runFetch()-function 是異步的,因此默認(rèn)情況下(除非我等待它)返回一個(gè)承諾。迭代之后,我會(huì)同時(shí)等待所有的承諾,所以他們可以并行運(yùn)行,但仍然等待最慢的承諾。
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貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
Javascript 這樣做是因?yàn)?forEach 不是承諾感知的。它不支持異步和等待,因此您不能在 forEach 中使用等待。相反,使用for...of循環(huán):
for(const dataItem of entity) {
for(const userParamItem of userParams) {
const Marks = await _fetchMark(req, dataItem.MKTUNITID);
//do some manipulation to Marks
}
}
});
doSomething();
這樣嵌套循環(huán)將首先和doSomething()最后執(zhí)行。
如果您想了解更多信息,這是一篇不錯(cuò)的帖子: https ://zellwk.com/blog/async-await-in-loops/
添加回答
舉報(bào)