Как правильно обрабатывать ошибки и использовать обещания - PullRequest
0 голосов
/ 27 декабря 2018

Начну с того, что я отвечаю на этот вопрос, который я опубликовал несколько мгновений назад

Теперь я подумал, что знаю Aysnc и Promise, но явно что-то упускаю.

Ссылка на помеченный ответ estus ,

Если API не поддерживает обещания, ошибки должны полностью обрабатываться в асинхронной функции.Тело функции должно быть заключено в try..catch, чтобы исключить необработанные отклонения, которые могут привести к исключениям в будущих версиях Node

Из чего я смог понять, что всякий раз, когда мы используем функция aysnc и мы хотим сделать Обработка ошибок нам нужно использовать try..catch, а для обычных обещаний мы можем просто сделать разрешить / отклонить или, если этоуже обещание, тогда мы можем связать и сделать .then и .catch, но для этого я получил следующий ответ на комментарий

Да, вы можете ожидать ошибку.async / await - просто синтаксический сахар для необработанных обещаний.Любая асинхронная функция может быть переписана простым ES6

Возможно, этот вопрос будет расширен, но кто-то может помочь мне объяснить ..

Когда нам нужно использовать

.then и .catch

и когда нам нужно использовать

try..catch

Кроме того, что означает

Если только APIподдерживает обещания

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018
Функция

try...catch в async является синтаксическим сахаром для catch() в необработанном обещании.Если по какой-то причине используются необработанные обещания (устаревший код), то можно использовать catch().Это не должно быть проблемой в Node, так как последние версии поддерживают async..await.

. Обратите внимание, что try..catch ловит как синхронные, так и асинхронные ошибки в async.Это следует учитывать, чтобы не оставлять синхронные ошибки необработанными с простым обещанием.

Если API не поддерживает обещания, вы не можете ожидать, что отклонение обещания, возвращаемое функцией, будет обработано API, поэтому вам нужносделать это самостоятельно.

0 голосов
/ 27 декабря 2018
 // So this is how promises work (as you may already be familiar with)
function promiseFu() {
    return new Promise((resolve, reject) => {
        reject();
    })
    .catch(e => {
        // The exception has been handled
        console.error("Error begin in promiseFu()!")
        throw e; // <- now this triggers the second exception
    })
}

// Asynchronous functions are the functions that ALWAYS returns a promise
// therefore, this is also correct
async function asyncFu() {
    return new Promise((resolve, reject) => {
        reject();
    })
    .catch(e => {
        // The exception has been handled
        console.error("Error begin in promiseFu()!")
        throw e; // <- now this triggers the second exception
    })
    .catch(e => {
        // Here the second exception gets handled as well, and asyncFu does not throw any exception in the end
    })
}

// Now the power of async await
async function asyncMainFu() {
    // using await before an async function would make it wait for the function to complete asynchronously before moving on
    await asyncFu()

    // await would do the same with promises as well
    // await promiseFu() // <- this is correct as well

    // BUT now, if you see promiseFu() is throwing the second exception which is not yet handled,
    // asyncMainFu() would throw the same exception as well. unless handled by a try..catch block
    try {
        await promiseFu()
    } catch(e) {
        // handling the exception thrown by promiseFu and not throwing any new exception 
        // is a good idea if you think caller of asyncMainFu() might not handle it.
    }
}
0 голосов
/ 27 декабря 2018

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

Если вы используете синтаксис простых обещаний, вы можете использовать синтаксис .then.then.then.catch ().

если вы используете async и ожидаете, то вам нужно использовать try catch.Все ожидание будет выполнено при попытке, а условие перехвата будет выполнено в виде одного перехвата.

И то, и другое можно использовать, когда используемый API / функция возвращает обещание.

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