我正在编写用于异步/等待并行处理的代码,但是如果发生任何错误而不处理记录的其余部分,它将不处理所有记录
async function test() {
let i = 0
let userId = [5000, 1000, 7000]
try {
while (i < userId.length) {
const userEmail = await getUserEmail(userId[i])
let sendEmailResult = await postSendUserEmail(userEmail)
i++
}
} catch (err) {
console.log('Got error')
}
}
(async () => {
await test();
// Do some logic here
console.log('All done')
})().catch(e => console.log(e));
function getUserEmail(milis) {
return new Promise(function(resolve, reject) {
if (milis == 1000) {
setTimeout(() => {
console.log('Rejecting millis', milis)
return reject('Got error')
}, milis);
} else {
setTimeout(() => {
console.log('Processing millis', milis)
return resolve(milis);
}, milis);
}
})
}
function postSendUserEmail(milis) {
return new Promise(function(resolve, reject) {
if (milis == 1000) {
setTimeout(() => {
console.log('Rejecting email', milis)
return reject('Got email error')
}, milis);
} else {
setTimeout(() => {
console.log('Sending email', milis)
return resolve(milis);
}, milis);
}
})
}
此处,当value为1000时,getUserEmail拒绝promise
我的问题是,当同时循环处理每个记录的所有操作时,为什么不处理所有记录(如果发生任何拒绝),那么如何使用async / await解析/拒绝来处理所有记录
答案 0 :(得分:0)
您在await
循环中拥有的while
阻止了循环的执行和继续,直到它们完成为止。
您可以将这些函数调用移至单独的函数,它将继续执行:
async function test() {
let i = 0
let userId = [5000, 1000, 7000]
try {
while (i < userId.length) {
handleUser(userId[i]);
// const userEmail = await getUserEmail(userId[i])
// let sendEmailResult = await postSendUserEmail(userEmail)
i++
}
} catch (err) {
console.log('Got error')
}
}
async function handleUser(user) {
const userEmail = await getUserEmail(user)
let sendEmailResult = await postSendUserEmail(userEmail)
}
或者,如果您希望一次处理每个用户1,则可以将try...catch
移动到while
循环内。
答案 1 :(得分:0)
您的try/catch
块不在循环中。如果对它进行重新排列,使其以每次迭代为基础,则可以避免一个坏苹果破坏一堆苹果的情况。尝试将测试功能更改为:
while (i < userId.length) {
try {
const userEmail = await getUserEmail(userId[i])
let sendEmailResult = await postSendUserEmail(userEmail)
} catch (err) {
// err handling here
// ....
}
// Need to do this regardless of whether or not error occured.
i++
}