Использование Try / Catch с Promise.all - PullRequest
0 голосов
/ 30 декабря 2018

Я недавно читал об async / await и использовал try и catch для обработки отклонений обещаний и применял его к некоторым моим старым кодам.

У меня есть следующее:

async function() {
    try {
        await Promise.all([some functions]);
        doIfNoError();
    } catch (error) {
        console.log(error);
    }

Функции, которые я передаю в Promise.all, имеют следующую форму:

async function() {
    some code
    if (some condition) {
        return true
    } else {
        throw false
    }
 }

Я предполагаю, что если какая-либо из функций, переданных в Promise.all, будет отклонена, отобразится отклонение.Если ни одна из функций не отклоняет, doIfNoError должен сработать.Однако doIfNoError иногда срабатывает, когда не должен, и мне выдается сообщение об ошибке «Unhandled Promise Rejection».

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Попробуйте использовать обещания в полной мере, включая блокировку отклоненных обещаний.Обратите внимание, что если doIfNoError также выдает ошибку, она будет перехвачена с catch.

async function() {
    await Promise.all([some promises])
    .then(doIfNoError) // Promise.all resolved
    .catch(console.log) // Promise.all has at least one rejection
}

promiseAll = async (promises) => {
  await Promise.all(promises)
  .then(doIfNoError) // Promise.all resolved
  .catch(console.log) // Promise.all has at least one rejection
}
    
doIfNoError = () => console.log('No errors');

promiseAll([Promise.resolve(), 1, true, () => (false)]);
promiseAll([Promise.resolve(), 1, true, Promise.reject('rejected: because reasons'), Promise.resolve()]);
0 голосов
/ 30 декабря 2018

1) throw false - это не имеет смысла, вы не должны выдавать логическое значение, а вместо этого должен использоваться экземпляр Error.

2) catch срабатывает только при возникновении ошибки илиОбещание «отклонено» (примечание: «Отклонить и бросить» имеют тот же эффект с асинхронным ожиданием).Напротив: «Разрешение» обещания с логическим значением false не интерпретируется async-await как исключение.Поэтому убедитесь, что вы throw допустили ошибку или отклонили обещание, если хотите, чтобы сработал блок catch. Если вы reject, передаете исключение в качестве аргумента для отклонения, например (* Promise.reject(new Error("Something went wrong")).

Помимо того, что я упомянул выше, ваш код выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...