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/
添加回答
举报