web-dev-qa-db-ja.com

jQuery:deferred.always()とdeferred.then()の違いは何ですか?

どちらも同じことをしているように私には思えます。

ドキュメント:

26
Niyaz

deferred.then()を使用すると、成功と失敗の2つの別々のコールバックを渡すことができますが、deferred.always()nの数のコールバックを受け取り、結果に関係なくすべて呼び出されます。最初のイベントの。

最初のイベントの成功/失敗が重要でない場合は、deferred.always()を使用すると思います

33
JamesHalsall

.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();
});
7
João Silva

JQuery 1.8より前:.always(fn).then(fn, fn)と同等です

JQuery 1.8以降:.always(fn).then(fn, fn)に似ていますが、返されるものが異なります( http://api.jquery.com/deferred.then/を参照 詳細)

6
Ignitor

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
});
0
schlamar