Любая проблема с уловом отклонила обещание и превратила его в исправленный код ошибки? - PullRequest
0 голосов
/ 18 января 2019

Я работаю над проектом, который всегда отлавливает отклоненное обещание, превращает его в решенный с кодом ошибки, например

return new Promise((resolve, reject) => {
        axios({
          ...
        }).then(res => {
            resolve(res);
        }).catch(err => {
            let res = { ... }
            res.error = err
            resolve(res)
        })
    })

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

   axios_call(...).then(res => {
        if (!res.err) {
            //resolve case
        } else {
            //reject case
        }
    })

Я никогда не обрабатывал отклоненное обещание, как это раньше, поэтому я не уверен, что это вызовет какие-либо проблемы, или это просто другой стиль кода и тоже отлично работает.

Я проверил возможные дубликаты q / a Что такое явная конструкция обещания antipattern и как мне ее избежать? Но я верил, что они не одинаковы. Потому что мой вопрос касается обработки отклоненного обещания, в то время как этот вопрос касается отложенного объекта, например ошибки и отклонения не глотаются в моем случае.

1 Ответ

0 голосов
/ 18 января 2019

Прежде всего, избегайте конструктора Promise antipattern ! Ваш axios_call код должен выглядеть лучше просто так:

return axios({
    ...
}).catch(err => {
    return { ..., error: err };
});

Затем при вызове этого API отклоненный случай обрабатывается без catch. Я никогда не обрабатывал отклоненное обещание, как это раньше, поэтому я не уверен, что это вызовет какие-либо проблемы, или это просто другой стиль кода и тоже отлично работает.

Работает, но не нормально. Этот стиль обработки ошибок странный и действительно не идиоматический. У него те же проблемы, что и у традиционного API обратного вызова в стиле узла с отдельными параметрами error и result:

  • обещание не может знать, обработали ли вы ошибку или нет. Вы не получите необработанного отказа предупреждений.
  • вы всегда должны писать код для работы с res.error, хотите вы этого или нет. При обычном использовании обещания вы могли бы просто предоставить отдельные обратные вызовы onFulfill и onReject, и если вы пропустите последний, вы получите разумное поведение по умолчанию для пересылки ошибки вместо ее удаления.

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

...