我正在从事NestJSxMongoosestore 管理项目.

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

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的内容时,它包含实际的预期数据.但当我try 在forEach()循环之外使用它时,它记录了一个空array.我想使用forEach()之外的array.

我做错了什么?

推荐答案

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

.forEach(以及.map)同步运行.如果您将异步函数作为参数传递,它不会将其传递给await个参数,它只会将其执行到最近的等待,然后返回(仍然未解析)promise.

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

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相关问答推荐

node 上的磁盘压力

如何在JavaScript中使用Mongoose将项推送到MongoDB中的重嵌套数组

ForbidenError:使用Express.js的CSRF令牌无效

当变量在另一个文件中初始化时,在初始化错误之前无法访问变量

无法生成仅具有生产依赖项的 node 类型脚本项目

使用AWS SDK for JavaScript V3将图像从node.js上传到s3 bucket

处理嵌套元素时,使用xml2js库解析XML时发生错误

npm 在 Windows 终端中不工作

mongoose 7.0.3 使用运算符 $and 严格搜索日期

错误:无法为 /blog 收集页面数据并且在 object.fetch 处获取失败

未捕获的错误: 只能用作 元素的子元素,永远不会直接呈现.请将您的 包裹在

对 google api v3 的 Axios 请求返回加密(?)数据

是Electron 的密码和登录凭据的安全存储吗?

在 Express.js 中迭代子文档数组

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

Sharp JS 依赖关系 destruct 了 Elastic Beanstalk 上的 Express Server

Node.js 大文件上传到 MongoDB 阻塞了事件循环和工作池

使用 grunt 服务器,如何将所有请求重定向到根 url?

路由后的 Node Express 4 中间件

在 Node.js 中混合使用 JavaScript 和 TypeScript