📅  最后修改于: 2023-12-03 14:44:44.747000             🧑  作者: Mango
在 Node.js 中,我们经常会遇到需要遍历一个数组或者集合,并在遍历过程中执行异步操作的情况。在这种情况下,我们可能会想到使用 forEach
循环来遍历集合并执行异步操作。但是,由于 forEach
循环是同步的,所以不能直接在循环中使用 await
关键字。那么,如何在 forEach
循环中使用 await
呢?下面,我们将介绍两种不同的方法。
在 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 完成。
另一种方法是使用 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
循环可以保证顺序执行,具体使用哪种方法可以根据实际情况进行选择。