ES6异步/等待并行处理

时间:2019-05-29 19:03:47

标签: node.js ecmascript-6 promise async-await es6-promise

我正在编写用于异步/等待并行处理的代码,但是如果发生任何错误而不处理记录的其余部分,它将不处理所有记录

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解析/拒绝来处理所有记录

2 个答案:

答案 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++
    }