One sometimes-unintuive aspect of promises is that if you throw an exception in the fulfillment handler, it will not be caught by the error handler.
return foo()
.then(function (value) {
throw new Error("Can't bar.");
}, function (error) {
// We only get here if "foo" fails
});
To see why this is, consider the parallel between promises and try
/catch
. We are try
-ing to execute foo()
: the error handler represents a catch
for foo()
, while the fulfillment handler represents code that happens after the try
/catch
block. That code then needs its own try
/catch
block.
In terms of promises, this means chaining your rejection handler:
return foo()
.then(function (value) {
throw new Error("Can't bar.");
})
.fail(function (error) {
// We get here with either foo's error or bar's error
});