日々精進

新しく学んだことを書き留めていきます

jQueryPromiseは一度rejectされるとその後のすべてのfailが呼ばれる

以下の例だと#1,#2の両方が呼ばれる。

var firstDeferred = $.Deferred(), secondDeferred = $.Deferred();

firstDeferred.promise()
.fail(function (error) {
  // #1
})
.then(function () {
    return secondDeferred.promise();
})
.fail(function (error) {
  // #2
});

firstDeferred.reject('first deferred object');

途中でrejectが伝わるのを防ぎたい場合はthenに関数を渡す。then( doneFilter , failFilter )となっているので、第二引数に関数を渡すとそこまででfailの実行は止まる。

var firstDeferred  = $.Deferred(),
    secondDeferred = $.Deferred();

firstDeferred.promise()
.fail(function (error) {
    console.log(error);
})
.then(null, function () { // Notice the null
    return secondDeferred.promise();
})
.fail(function (error) {
    console.log(error);
});

firstDeferred.reject('first deferred object');
secondDeferred.reject('second deferred object');

↑を実行すると↓のログが出る。

first deferred object
second deferred object 

参考: