📜  nodejs如何在foreach循环中使用await - Javascript(1)

📅  最后修改于: 2023-12-03 14:44:44.747000             🧑  作者: Mango

Node.js 如何在 forEach 循环中使用 await

在 Node.js 中,我们经常会遇到需要遍历一个数组或者集合,并在遍历过程中执行异步操作的情况。在这种情况下,我们可能会想到使用 forEach 循环来遍历集合并执行异步操作。但是,由于 forEach 循环是同步的,所以不能直接在循环中使用 await 关键字。那么,如何在 forEach 循环中使用 await 呢?下面,我们将介绍两种不同的方法。

1. 使用 Promise.all() 方法

在 Promise 中,有一个 Promise.all() 方法,它可以接收一个 Promise 数组作为输入,并在所有 Promise 都完成后返回一个 Promise。我们可以将 forEach 循环中的异步操作封装成 Promise,并将所有 Promise 放入数组中,然后使用 Promise.all() 方法等待所有 Promise 完成。

以下是示例代码:

async function asyncForEach(array, callback) {
  const promises = [];
  for (let index = 0; index < array.length; index++) {
    const promise = callback(array[index], index, array);
    promises.push(promise);
  }
  await Promise.all(promises);
}

const arr = [1, 2, 3];

asyncForEach(arr, async (num) => {
  await someAsyncOperation(num);
});

上面的代码中,我们定义了一个 asyncForEach 函数,它接收一个数组和一个回调函数作为输入。在函数中,我们使用 for 循环遍历数组,将每个数组元素传给回调函数,并将返回的 Promise 放入一个数组中。最后,我们使用 Promise.all() 方法等待所有 Promise 完成。

2. 使用 for...of 循环

另一种方法是使用 for...of 循环,它是 ES6 中新增的一种遍历方式,可以直接遍历集合的值。在 for...of 循环中,我们可以使用 await 关键字直接等待异步操作完成。

以下是示例代码:

const arr = [1, 2, 3];

async function asyncFunc(num) {
  await someAsyncOperation(num);
}

(async function () {
  for (const num of arr) {
    await asyncFunc(num);
  }
})();

上面的代码中,我们定义了一个 asyncFunc 函数,它接收一个参数,并在函数中执行异步操作。在主函数中,我们使用 for...of 循环遍历数组,并在循环中使用 await 关键字等待异步操作完成。

结语

使用以上两种方法,你可以在 forEach 循环中使用 await 关键字,但是需要注意的是,forEach 循环中的异步操作不能保证顺序执行,而使用 for...of 循环可以保证顺序执行,具体使用哪种方法可以根据实际情况进行选择。