Promises - обратный вызов ошибки против catch

Может ли кто-нибудь сказать мне, существует ли разница между использованием обратного вызова ошибки и функцией catch при использовании $q.promise, пожалуйста?

например. являются ли два фрагмента кода функционально эквивалентными?

function doSomething0() {
    var deferred = $q.defer();

    ...

    return deferred.promise;
 }

 doSomething0()
    .then(doSomething1)
    .then(doSomething2)
    .then(doSomething3)
    .catch(function (err) {
        // do something with `err`
    });

против.

function doSomething0() {
    var deferred = $q.defer();

    ...

    return deferred.promise;
 }

 function errorHandler(err) {
    // do something with `err`
 }

 doSomething0()
    .then(doSomething1, errorHandler)
    .then(doSomething2, errorHandler)
    .then(doSomething3, errorHandler);

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

Ответы

Ответ 1

Оба будут добиваться того же, кроме второго, можно запустить errorHandler три раза (вместо одного раза). Вы правы, что это приводит к дублированию кода, но также позволяет вам обрабатывать любую ошибку и продолжать свою цепочку:

function errorHandler(err) {
  //log error, continue
  return $q.resolve('default value or something');
}

doSomething0()
  .then(doSomething1, errorHandler)
  .then(doSomething2, errorHandler)
  .then(doSomething3, errorHandler);