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

时间:2018-08-08 04:35:19

标签: javascript node.js foreach async-await

在node.js中,我需要使用包含Array.foreach的function procesMultipleCandidates () 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 
}

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

4 个答案:

答案 0 :(得分:7)

使用Array.prototype.mapPromise.all

console.log

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

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 
}

答案 1 :(得分:2)

authorization尝试顺序执行,并且您可能不会总是获得预期的结果。

Array.prototype.forEach()广泛用于创建使用数据的承诺,然后使用Array.prototype.map()

进行解析。

使用await Promise.all([])函数,所有的诺言都可以并行解决,如果您碰巧调用API,则可能最终获得.map()

要依次执行所有承诺,可以使用 error 429: Too many Requests

for ...of

MDN Reference

答案 2 :(得分:1)

请改用Promise.all,一旦传递给它的数组中的所有Promises都解决了,它将解决。如果使用并返回一个普通的Promise链而不是async / await,则语法可能会简化:

const procesMultipleCandidates = data => Promise.all(
  data.map(insertionInCandidate)
)
.catch(err => {
  console.log('err: ' + err);
});

请注意,如果出现错误,procesMultipleCandidates将返回已解决的Promise而不是拒绝-最好让消费者为{{1 }}处理错误,以便它可以适当地处理错误(而不是简单地procesMultipleCandidates对其进行处理)。

答案 3 :(得分:1)

就我而言,for of在异步方面比forEach更好。无论如何,在这种情况下,如果您只关心汇总结果,我认为这可能是一个解决方案。

async function procesMultipleCandidates(data) {
  const promises = data.map(insertionInCandidate);
  return await Promise.all(promises);
}