我正在从事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相关问答推荐

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

如何使用Node.js、Express和Mongoose创建多个API

编辑Mongoose中的对象嵌套数组

如何在RavenDB中执行JS索引?

当 Got 包因错误 JSON 崩溃时如何获取响应文本?

如何在 require 方法中使用路径与node.js react ?

Node.js中使用ffmpeg如何获取视频截图的位置?

如何在 Firestore 函数上使用类型模型来获取字段值

Solidity 将数据位置从内存更改为存储

mongoose findOneAndUpdate 不更新数据库

运行 cypress 测试时如何指定 .env 文件用于我的开发服务器?

为什么要加密 CSRF 令牌?

为什么我的 Cypress Post 请求的请求正文是空的?

从数据库读取数据并将其作为可下载的 zip 文件发送

Node js中向rest服务发送https请求的步骤

TypeError:请求路径包含未转义的字符,我该如何解决这个问题

Puppeteer 记录在 page.evaluate

nodejs:Ajax 与 Socket.IO,优缺点

在 Node.js 中写入 CSV

npm install packagename --save-dev 不更新 package.json