gpt4 book ai didi

node.js - JavaScript : Empty array after foreach loop

转载 作者:行者123 更新时间:2023-12-05 03:21:32 25 4
gpt4 key购买 nike

我正在从事 NestJSxMongoose 商店管理项目。

我有这段代码,我想在其中更新数据库中的一些项目,并将这些更新的项目放入一个数组中,我稍后会用到。

const updatedItems: Item[] = [];

purchaseData.items.forEach(async (purchasedItem) => {
const itemInDB = await this.itemService.findItemByName(purchasedItem.name);

itemInDB.quantity -= purchasedItem.quantity;

const updatedItem = await this.itemService.updateItem(
itemInDB['_id'],
itemInDB
);

updatedItems.push(updatedItem);

console.log(updatedItems); // Output : [{actual_data}]
});

console.log(updatedItems); // Output : []

我遇到的问题是,当我在 forEach() 中记录 updatedItems 的内容时,它包含实际预期的数据。但是当我尝试在 forEach() 循环之外使用它时,它会记录一个空数组。我想在 forEach() 之外使用该数组。

我做错了什么?

最佳答案

如果你想等待结果,你必须这样写:获取所有 promise 的数组并等待它们。

.forEach(以及 .map)同步运行。如果您将异步函数作为参数传递,它不会 await 它们,它只是将它们执行到最近的 await 然后返回(仍 Unresolved )promise。

因此 console.log(updatedItems);//输出:[] 在异步函数内部的逻辑之前执行。

const updatedItems: Item[] = [];

const promises = purchaseData.items.map(async (purchasedItem) => {
const itemInDB = await this.itemService.findItemByName(purchasedItem.name);

itemInDB.quantity -= purchasedItem.quantity;

const updatedItem = await this.itemService.updateItem(
itemInDB['_id'],
itemInDB
);

updatedItems.push(updatedItem);

console.log(updatedItems); // Output : [{actual_data}]
});

await Promise.all(promises);

console.log(updatedItems); // Output : []

在这里你可以看到执行顺序:

const purchaseData = { items: [1,2] }

purchaseData.items.forEach(async (purchasedItem) => {
console.log('first', purchasedItem);
await console.log(); // the awaiting console log does nothing, it is just to trigger the beaviour of async function when it hits await
console.log('third', purchasedItem);
});

console.log('second');

关于node.js - JavaScript : Empty array after foreach loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72952280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com