在包含承诺的 forEach 循环上承诺

我嵌套了 forEach 循环,其中一个循环包含另一个 await 调用。我希望我的函数 doSomething 仅在嵌套循环完成后才执行。现在 doSomething() 首先被执行。


    entity.forEach(function (dataItem) {

        userParams.forEach(async function (userParamItem) {

                const Marks = await _fetchMark(req, dataItem.MKTUNITID);

                //do some manipulation to Marks


            }


        }

    });

});

做一点事();


翻阅古今
浏览 170回答 3
3回答

ABOUTYOU

forEach在这种情况下可能有点棘手,您可以简单地使用for循环,因为它们不会跳转到下一个项目,直到所有承诺都没有解决for(i =0; i < entity.length; i++)&nbsp;{&nbsp; &nbsp; let dataItem = entity[i]&nbsp; &nbsp; for(j =0; j < userParams.length; j++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; let userParamItem = userParams[i]&nbsp; &nbsp; &nbsp; &nbsp; const Marks = await _fetchMark(req, dataItem.MKTUNITID);&nbsp; &nbsp; &nbsp; &nbsp; //do some manipulation to Marks&nbsp; &nbsp; }}

慕田峪9158850

每当我必须在 forEach(或任何迭代器循环;for、while、数组方法)中使用等待时,我喜欢创建一个小数组来存储所做的承诺。我会打出一个例子。我有一个 10 个 url 的列表,我想对其进行提取,并在运行之前存储结果doSomething()。我的runFetch()-function 是异步的,因此默认情况下(除非我等待它)返回一个承诺。迭代之后,我会同时等待所有的承诺,所以他们可以并行运行,但仍然等待最慢的承诺。const urls = [...] // my urlsconst promises = []for (const url of urls) {&nbsp; &nbsp; promises.push( runFetch(url) )}const results = await Promise.all(promises)//now that all my fetches are done, I can continue.doSomething()

人到中年有点甜

Javascript 这样做是因为 forEach 不是承诺感知的。它不支持异步和等待,因此您不能在 forEach 中使用等待。相反,使用for...of循环:for(const dataItem of entity) {&nbsp; &nbsp; for(const userParamItem of userParams) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const Marks = await _fetchMark(req, dataItem.MKTUNITID);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //do some manipulation to Marks&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }});doSomething();这样嵌套循环将首先和doSomething()最后执行。如果您想了解更多信息,这是一篇不错的帖子: https ://zellwk.com/blog/async-await-in-loops/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript