Node.js nodej使用foreach vs for按顺序执行

Node.js nodej使用foreach vs for按顺序执行,node.js,async-await,Node.js,Async Await,我想以相同的顺序为我拥有的每一项执行一系列的事情,收集信息,然后在最后发送统计数据 下面是示例代码: let listOfItems = []; assignedItems.forEach(async (item) => { let id = item.myID; totalItemCount += await itemRepository.getItemCount(id); let itemDetail = await itemRepository.getDet

我想以相同的顺序为我拥有的每一项执行一系列的事情,收集信息,然后在最后发送统计数据

下面是示例代码:

let listOfItems = [];
assignedItems.forEach(async (item) => {
    let id = item.myID;
    totalItemCount += await itemRepository.getItemCount(id);

    let itemDetail = await itemRepository.getDetails(id);
    listOfItems.push(item.name);
}, this);
console.log(listOfItems.length); // 0 ??
vs

让listOfItems=[];
for(设i=0;i
使用foreach的输出:0(因为foreach稍后执行) 按预期使用for:5的输出(因为for是在编写代码执行时执行的)

主要问题是:foreach是在我的console.log之后执行的,它是在foreach之后写入的,因为我想先收集项目的所有详细信息,然后发送我收集的数据


你到底在干什么?如何使用foreach解决此问题?

请阅读本文,我希望您能在这里找到答案。
请阅读这篇文章,我希望你能在这里找到答案。
.forEach()
无法与
一起使用,请按您希望的方式等待
。如果要序列化内容,只需使用实际的
for
循环和
wait

如果您在不使用
.forEach()
时遇到问题,请解释该问题,以便我们帮助解决该问题

.forEach()
是同步的,不会
等待
任何东西,也无法更改它。如果您希望循环的每次迭代都等待您的承诺,那么您必须以不同的方式进行循环。在ES6中,
for
循环可以为您实现这一点(这是ES6明确设计的功能),或者您可以自定义自己的手动循环,该循环将等待
,但
.forEach()
无法实现

你到底在干什么

.forEach()
是同步的。它不会等待你的承诺。它就是这样设计的

如何使用foreach解决此问题

你没有。如果要在继续之前等待循环的每次迭代,请使用常规的
for
循环。这是ES6的一项功能,它使用常规的
for
循环,而不是
.forEach()


仅供参考,如果您想要一个类似于
.forEach()
的功能来等待承诺,您可以使用和使用类似于
promise.mapSeries()
promise.each()
。这些函数都会寻找从回调返回的承诺,并且在这些承诺得到解决之前不会执行下一次迭代。但是,
array.forEach()
没有内置该功能


还有使用
.reduce()
的设计模式,并承诺通过一个串联调用异步操作的数组进行排序。您可以在以下答案中看到该模式的示例:

.forEach()
无法与
一起使用,请按您希望的方式等待
。如果要序列化内容,只需使用实际的
for
循环和
wait

如果您在不使用
.forEach()
时遇到问题,请解释该问题,以便我们帮助解决该问题

.forEach()
是同步的,不会
等待
任何东西,也无法更改它。如果您希望循环的每次迭代都等待您的承诺,那么您必须以不同的方式进行循环。在ES6中,
for
循环可以为您实现这一点(这是ES6明确设计的功能),或者您可以自定义自己的手动循环,该循环将等待
,但
.forEach()
无法实现

你到底在干什么

.forEach()
是同步的。它不会等待你的承诺。它就是这样设计的

如何使用foreach解决此问题

你没有。如果要在继续之前等待循环的每次迭代,请使用常规的
for
循环。这是ES6的一项功能,它使用常规的
for
循环,而不是
.forEach()


仅供参考,如果您想要一个类似于
.forEach()
的功能来等待承诺,您可以使用和使用类似于
promise.mapSeries()
promise.each()
。这些函数都会寻找从回调返回的承诺,并且在这些承诺得到解决之前不会执行下一次迭代。但是,
array.forEach()
没有内置该功能


还有使用
.reduce()
的设计模式,并承诺通过一个串联调用异步操作的数组进行排序。您可以在以下答案中看到该模式的示例:


除了链接之外,不包含任何实际内容的答案不在堆栈溢出准则范围内。答案应包含实际内容本身。这是因为外部链接习惯于随着时间的推移中断或更改内容,这会破坏答案作为长期参考的实用性。我希望得到更深入的答案。除了链接之外,不包含任何实际内容的答案不在堆栈溢出准则的范围内。答案应包含实际内容本身。这是因为外部链接有一个习惯,随着时间的推移会中断或更改内容,这破坏了答案作为长期参考的有用性。我希望得到更深入的答案。我认为你的问题是重复的,我认为你的问题是重复的
let listOfItems = [];
for (let i = 0; i < assignedItems.length; i++) {
    let id = assignedItems[i].myID;
    totalItemCount += await itemRepository.getItemCount(id);

    let itemDetail = await itemRepository.getDetails(id);
    listOfItems.push(itemDetail.name);
}
console.log(listOfItems.length); // 5 as expected