ES6 асинхронная / ожидание параллельной обработки - PullRequest
0 голосов
/ 29 мая 2019

Я пишу код для асинхронной / ожидающей параллельной обработки, но он не обрабатывает все записи, если произошла какая-либо ошибка, не обрабатывает остальную часть записи

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);

    }
})
}

Здесь getUserEmail отклоняет обещание, когда значение равно 1000,

Мой вопрос заключается в том, что при циклической обработке всех операций параллельно для каждой записи и почему не все записи не обрабатываются, если происходит какое-либо отклонение, то как обрабатывать все записи, разрешить или отклонить, используя async / await

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Ваш 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++
    }
0 голосов
/ 29 мая 2019

await s, которые есть у вас внутри цикла 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.

...