29

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

ドキュメント:

4

4 に答える 4

35

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

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

于 2012-09-16T15:33:13.377 に答える
7

を使用すると、が解決され.then()たとき()に個別のコールバックを提供し、が拒否されたとき( )にのコールバックを提供できます。$.Deferreddone$.Deferredfail

.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();
});
于 2012-09-16T15:34:37.467 に答える
6

jQuery 1.8より前:.always(fn)と同等.then(fn, fn)

jQuery 1.8以降:.always(fn)と似て.then(fn, fn)いますが、返される内容が異なります(詳細については、http://api.jquery.com/deferred.then/を参照してください)。

于 2012-09-24T15:15:29.400 に答える
0

(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
});
于 2013-07-02T14:19:13.623 に答える