keldar
keldar

Reputation: 6252

Promises - error callback vs. catch

Can somebody tell me if there is a difference between using an error callback vs. a catch function, when using $q.promise please?

E.g. are the two snippets of code functionally equivalent?

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

    ...

    return deferred.promise;
 }

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

vs.

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);

If so, why use the second one? It looks far uglier and leads to more code duplication in my opinion?

Upvotes: 20

Views: 5511

Answers (2)

AlexMelw
AlexMelw

Reputation: 2624

Let's have a look at the first sample:

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


// I've represented functions invocations as if they were synchronous to simplify the example to focus on the error handling
// The above sample is in a way "equivalent" to
try {
    // doSomething0()
    try {
        // doSomething1()
        try {
          // doSomething2()
        } catch(e0) {
           // handle error
        }  
    } catch(e1) {
         // handle error
    }
} catch(e2) {
     // handle error
}
// doSomething3()

But if an exception happens in the doSomething3 handler, it won't be handled.

Ok, let's have a look at the second sample:

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


// I've represented functions invocations as if they were synchronous to simplify the example to focus on the error handling
// The above sample is in a way "equivalent" to
try {
    // doSomething0()
    // doSomething1()
    // doSomething2()
    // doSomething3()
}
catch(e) {
    // Catch 'em all
    console.log(e)
}

Upvotes: 2

Marcelo
Marcelo

Reputation: 4608

Both will achieve the same thing, except the second one might run errorHandler three times (instead of just once). You are correct that it brings some code duplication, but it also allows you to treat whatever error happened and continue with your chain:

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

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

Upvotes: 6

Related Questions