In most of the libs of the same name, you can link .fail() or .catch() , as in @ mido22's answer, but jQuery .fail() does not "handle" the error as such. It is guaranteed that an input promise (with an unchanged state) will always be transmitted, which would not allow to “break” the cascade if / when success occurs.
The only jQuery Promise method that can return a promise with a different state (or a different value / reason) is .then() .
Therefore, you can write a chain that continues in error by specifying the next step as an error handler at each stage.
function getDataUntilAsyncSuccess() { return $.Deferred().reject() .then(null, getData1) .then(null, getData2) .then(null, getData3); } //The nulls ensure that success at any stage will pass straight through to the first non-null success handler. getDataUntilAsyncSuccess().then(function (x) { //"success" data is available here as `x` }, function (err) { console.log('not found'); });
But in practice, you can often create an array of functions or data objects, which in turn are called using the Array .reduce() method.
For instance:
var fns = [ getData1, getData2, getData3, getData4, getData5 ]; function getDataUntilAsyncSuccess(data) { return data.reduce(function(promise, fn) { return promise.then(null, fn); }, $.Deferred().reject());
Or perhaps this is the best solution here:
var urls = [ '/path/1/', '/path/2/', '/path/3/', '/path/4/', '/path/5/' ]; function getDataUntilAsyncSuccess(data) { return data.reduce(function(promise, url) { return promise.then(null, function() { return getData(url);