deferred.then()
を使用すると、成功と失敗の2つの別々のコールバックを渡すことができますが、deferred.always()
はn
の数のコールバックを受け取り、結果に関係なくすべて呼び出されます。最初のイベントの。
最初のイベントの成功/失敗が重要でない場合は、deferred.always()
を使用すると思います
.then()
を使用すると、$.Deferred
が解決されたとき(done
)に個別のコールバックを提供し、$.Deferred
が拒否されたときにanotherを提供できます( fail
)。
一方、.always()
を使用すると、$.Deferred
が解決されたか拒否されたかに関係なく、常に実行されるコールバックを提供できます。つまり、このコールバック内では、AJAX呼び出しが失敗したか、正常に実行されたかは関係ありません。
$.Deferred
が正常に解決されたかどうかに関係なく、コードを毎回実行する場合は、コードを.always()
に配置する傾向があります。たとえば、AJAX読み込みインジケーターをクリアしたり、進行状況バーを非表示にしたりするには、.then()
を使用すると次のようになります。
$.get("/some/url").then(function () { // done callback
$(".progress-bar").hide();
}, function () { // fail callback
$(".progress-bar").hide();
});
.always()
を使用した場合、$.Deferred
が解決されたかどうかに関係なく、常に進行状況バーを非表示にしたいため、1つのコールバックが必要です。または拒否されました:
$.get("/some/url").always(function () {
$(".progress-bar").hide();
});
JQuery 1.8より前:.always(fn)
は.then(fn, fn)
と同等です
JQuery 1.8以降:.always(fn)
は.then(fn, fn)
に似ていますが、返されるものが異なります( http://api.jquery.com/deferred.then/を参照 詳細)
then
の大きな利点(1.8以降)は、コールバックの結果で解決されるpromiseを返すため、タスクを明示的にチェーンできることです。
ドキュメントからの例:
var request = $.ajax( url, { dataType: "json" } ),
chained = request.then(function( data ) {
return $.ajax( url2, { data: { user: data.userId } } );
});
chained.done(function( data ) {
// data retrieved from url2 as provided by the first request
});