Является ли перехват исключения функционально таким же, как обещание errorCallback?

Я использую промисы javascript в моем угловом приложении, но я устал повторять один и тот же errorCallback для каждого промиса. Я рассматриваю возможность просто обернуть обещание в блок try/catch и заставить блок catch обрабатывать любые сбои обещания.

Что приводит меня к вопросу: являются ли обратные вызовы ошибок избыточными, если они находятся в блоке try/catch? Будет ли javascript «поймать» ошибку?

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

try {
  $http.post().success(callback); 
}(catch)
{
}

Такой же как:

$http.post().succes(callback()).error(callback)

person user2202911    schedule 24.10.2014    source источник
comment
Пожалуйста, покажите конкретный код, о котором вы спрашиваете. Исключения — это не то же самое, что сбои обещаний, и исключения изначально не распространяются из асинхронных обратных вызовов. На это можно ответить, только когда вы спрашиваете о конкретном коде.   -  person jfriend00    schedule 24.10.2014
comment
Вы также должны указать, какую библиотеку обещаний вы используете, потому что разные библиотеки имеют разные функции для обработки исключений в обработчике обещаний.   -  person jfriend00    schedule 24.10.2014
comment
Добавил свой код. Используя angulars $http, который основан на angulars $q. Еще не решил, какой из них я должен использовать   -  person user2202911    schedule 24.10.2014
comment
Разве вы не имеете в виду $http.post().success(callback); без скобок после callback?   -  person jfriend00    schedule 24.10.2014
comment
@jfriend00 Исправлено.   -  person user2202911    schedule 24.10.2014
comment
На самом деле можно написать такой код, если вы хотите использовать передовые функции браузера, такие как генераторы и транспиляция для старых браузеров.   -  person Benjamin Gruenbaum    schedule 25.10.2014


Ответы (1)


Нет, не будет. Причина в том, что на самом деле вы ставите в очередь свою функцию обратного вызова, которая будет вызываться, когда запрос получит успешный асинхронный ответ. К тому времени выполнение переместится за ваш блок try/catch, и вы получите необработанную ошибку.

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

Если вы хотите вызвать один и тот же обработчик ошибок для нескольких асинхронных операций на основе обещаний, у вас есть несколько способов сделать это. Наиболее очевидным является внедрение $q в ваш контроллер и выполнение чего-то вроде этого:

var deferred1 = $http.get(...);
var deferred2 = someOtherPromiseBasedMethod(...);

$q.all([deferred1, deferred2, ..., deferredN])
    .then(null, function (rejection) {
        // first failed deferred will provide the rejection value here
    });

Другой подход заключается в создании функции-оболочки:

function handleError(deferred) {
    return deferred.then(null, commonErrorHandler);
}

handleError($http.get(...)).then(function (result) {
    // Handle the success case here
}

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

person Rytmis    schedule 24.10.2014