问题描述
1、最近在使用forEach循环数组,并在循环时处理数据,调用异步方法时发现它不支持处理异步函数。
forEach 是一个常用的数组方法,用于遍历数组的每个元素并执行一个提供的函数。这个方法没有返回值,也就是说它主要用于执行操作,而不是为了生成一个新的数组。然而,forEach 并不会等待每个回调函数的异步操作完成,它会继续执行下一个循环迭代,这可能会导致问题。
代码如下
const list = []
array.forEach((item,index)=>{
const result= await doSomethingAsync(item);
list.push(result)
})
// list打印为空
console.log(list)
以上代码中,doSomethingAsync 是一个异步操作方法,但是由于 forEach 不会等待每个回调函数内部的异步操作完成,list打印可能会在异步操作完成之前执行,这就有可能为空。
解决方案:
针对上面的问题,查找了一些解决方法,发现for循环和Promise.all这两种方法都会确保在异步操作完成后再进行下一次迭代,以保持 await 的正常工作。
const list = []
for (let index = 0; index < array.length; index++) {
const item = array[index]
const result= await doSomethingAsync(item);
list.push(result)
}
// 或是
Promise.all(array.map(item => {
return await doSomethingAsync(item)
})).then(data => {
list = data
}).catch(error=>{
})
// list打印不为空
console.log(await doSomethingAsync(item))