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执行首先完成。
使用Array.prototype.map和Promise.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)
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)
| 归档时间: |
|
| 查看次数: |
5326 次 |
| 最近记录: |