为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻阅古今 2022-12-02 10:40:40
我嵌套了 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            }        }    });});做一点事();
查看完整描述

3 回答

?
ABOUTYOU

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

    }

}


查看完整回答
反对 回复 2022-12-02
?
慕田峪9158850

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()


查看完整回答
反对 回复 2022-12-02
?
人到中年有点甜

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/


查看完整回答
反对 回复 2022-12-02
  • 3 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信