用包含异步等待的数组foreach等待

Iro*_*ack 1 javascript foreach node.js async-await

在node.js中,我需要使用一个function procesMultipleCandidates ()包含Array.foreach 的1,该进程将每个元素插入db。但整个功能应在完成所有插入操作后返回响应

JavaScript代码

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  await data.forEach(async (elem) => {
    try {    

           // here candidate data is inserted into  
           let insertResponse = await insertionInCandidate(elem) 
           //and response need to be added into final response array 
           generatedResponse.push(insertResponse)
    } catch (error) {
    console.log('error'+ error);
    }
  })
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}
Run Code Online (Sandbox Code Playgroud)

并且如上所述,最后一个return语句不等待foreach执行首先完成。

Sim*_*leJ 9

使用Array.prototype.mapPromise.all

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  await Promise.all(data.map(async (elem) => {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }))
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}
Run Code Online (Sandbox Code Playgroud)

或者,for/of如果您不希望循环并行运行,请使用循环:

async function procesMultipleCandidates (data) {
  let generatedResponse = []
  for(let elem of data) {
    try {
      // here candidate data is inserted into  
      let insertResponse = await insertionInCandidate(elem)  
      // and response need to be added into final response array 
      generatedResponse.push(insertResponse)
    } catch (error) {
      console.log('error'+ error);
    }
  }
  console.log('complete all') // gets loged first
  return generatedResponse // return without waiting for process of 
}
Run Code Online (Sandbox Code Playgroud)


Gee*_*bey 5

Array.prototype.forEach() 尝试顺序执行,您可能并不总是得到预期的结果。

Array.prototype.map() 广泛用于使用数据创建承诺,然后使用 await Promise.all([])

使用.map()函数,所有的承诺都是并行解决的,如果你碰巧调用了一个 API,你最终可能会得到error 429: Too many Requests

要按顺序执行所有承诺,您可以使用for ...of.

const array1 = ['a', 'b', 'c'];

for (const element of array1) {
  console.log(element);
}
Run Code Online (Sandbox Code Playgroud)

MDN 参考