在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
执行首先完成。
答案 0 :(得分:7)
使用Array.prototype.map和Promise.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
答案 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);
}