どちらも同じことをしているように私には思えます。
ドキュメント:
deferred.then()
成功と失敗のために2つの別々のコールバックを渡すことができるように見えますが、最初のイベントの結果に関係なくすべて呼び出されるコールバックの数をdeferred.always()
取ります。n
deferred.always()
最初のイベントの成功/失敗が重要ではない場合に使用すると思います
を使用すると、が解決され.then()
たとき()に個別のコールバックを提供し、が拒否されたとき( )に別のコールバックを提供できます。$.Deferred
done
$.Deferred
fail
.always()
一方、$.Deferred
が解決されたか拒否されたかに関係なく、常に実行されるコールバックを提供できます。つまり、このコールバック内では、AJAX呼び出しが失敗したか、正常に実行されたかは関係ありません。
.always()
私は、コードを毎回実行したいときに、$.Deferred
が正常に解決されたかどうかに関係なく、コードを挿入する傾向があります。たとえば、AJAX読み込みインジケーターをクリアしたり、進行状況バーを非表示にしたりします。.then()
あなたを使用すると、次のようなものになります:
$.get("/some/url").then(function () { // done callback
$(".progress-bar").hide();
}, function () { // fail callback
$(".progress-bar").hide();
});
を使用.always()
した場合は、コールバックを1つだけ必要とします。これは、が解決されたか拒否されたかに関係なく、常に進行状況バーを非表示にするためです。$.Deferred
$.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/を参照してください)。
(1.8以降)の大きな利点はthen
、コールバックの結果で解決される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
});