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

Javascript 使用包含异步等待的数组foreach等待,javascript,node.js,foreach,async-await,Javascript,Node.js,Foreach,Async Await,在node.js中,我需要使用一个函数procesMultipleCandidates(),该函数包含Array.foreach,该进程将每个元素插入数据库。但是整个函数应该在完成所有插入操作后返回响应 JavaScript代码 async function procesMultipleCandidates (data) { let generatedResponse = [] await data.forEach(async (elem) => { try {

在node.js中,我需要使用一个
函数procesMultipleCandidates()
,该函数包含Array.foreach,该进程将每个元素插入数据库。但是整个函数应该在完成所有插入操作后返回响应

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 
}

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

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

const procesMultipleCandidates = data => Promise.all(
  data.map(insertionInCandidate)
)
.catch(err => {
  console.log('err: ' + err);
});
请注意,如果出现错误,
procesMultipleCandidates
当前将返回已解决的
Promise
,而不是拒绝-最好让
procesMultipleCandidates
的使用者处理错误,以便它能够适当地处理错误(而不是简单地
console.log
ing).

使用和:

异步函数procesmultiple候选者(数据){
让generatedResponse=[]
等待Promise.all(data.map)(异步(elem)=>{
试一试{
//在这里,候选数据被插入到
let insertResponse=等待insertionncandidate(elem)
//和响应需要添加到最终响应数组中
generatedResponse.push(插入响应)
}捕获(错误){
console.log('error'+error);
}
}))
console.log('complete all')//首先记录
return generatedResponse//return,无需等待
}
如果不希望循环并行运行,请使用循环:

异步函数procesmultiple候选者(数据){
让generatedResponse=[]
对于(让数据元素){
试一试{
//在这里,候选数据被插入到
let insertResponse=等待insertionncandidate(elem)
//和响应需要添加到最终响应数组中
generatedResponse.push(插入响应)
}捕获(错误){
console.log('error'+error);
}
}
console.log('complete all')//首先记录
return generatedResponse//return,无需等待
}

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

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

使用
.map()
函数,所有承诺都会并行解决,如果您碰巧调用了API,您可能会得到
错误429:请求太多

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

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

for (const element of array1) {
  console.log(element);
}

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

异步函数procesmultiple候选者(数据){
const promises=data.map(insertionncandidate);
回报等待承诺。所有(承诺);
}

Your data.forEach本身会阻止执行,直到回调完成执行。此时不需要使用“wait”。这对我的解决方案很有帮助,每个
insertionncandidate()的响应
可以放入一个最终响应数组中吗?
.map
正在将
数据中的每个项目转换为
承诺
,该承诺将解析为使用项目调用
InsertionIndidate
的结果-将这些
承诺
的数组传递给
承诺。所有
,所有
都将解析为这些值的数组。不需要对代码进行修改-它非常简洁。