jQuery.ajaxの処理の継続応答:「成功:」vs「。完了」?


309

私は今、数週間のためのjQueryとAJAXで働いていると私は、呼び出しが行われた後、スクリプトを「継続」に二つの異なる方法を見ました:success:.done

私たちが得るjQueryドキュメントの概要から:

.done():説明:Deferredオブジェクトが解決されたときに呼び出されるハンドラーを追加します。

success:(.ajax()option):リクエストが成功した場合に呼び出される関数。

したがって、どちらもAJAX呼び出しが完了/解決された後で何かを行います。どちらかをランダムに使用できますか?違いは何ですか?一方が他方の代わりに使用されるときは?

回答:


469

successjQueryの成功コールバックの伝統的な名前であり、ajax呼び出しのオプションとして定義されています。ただし、$.Deferredsコールバックの実装とより高度なコールバックdoneは、で呼び出すことができるため、成功コールバックを実装するための推奨される方法deferredです。

たとえば、成功:

$.ajax({
  url: '/',
  success: function(data) {}
});

たとえば、done:

$.ajax({url: '/'}).done(function(data) {});

の良い点doneは、の戻り値が$.ajax、アプリケーションの他のどこにでもバインドできる延期されたプロミスであることです。したがって、いくつかの異なる場所からこのajax呼び出しを行いたいとしましょう。むしろこのAJAX呼び出しを行う関数へのオプションとしてあなたの成功の機能を渡すよりも、あなただけの関数の戻り持つことができ$.ajax、それ自体とバインドを使用して、コールバックdonefailthen、または何を。これalwaysは、リクエストが成功したか失敗したかにかかわらず実行されるコールバックであることに注意してください。done成功した場合にのみトリガーされます。

例えば:

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json',
    beforeSend: showLoadingImgFn
  })
  .always(function() {
    // remove loading image maybe
  })
  .fail(function() {
    // handle request failures
  });

}

xhr_get('/index').done(function(data) {
  // do stuff with index data
});

xhr_get('/id').done(function(data) {
  // do stuff with id data
});

保守性の点でこれの重要な利点は、ajaxメカニズムをアプリケーション固有の関数でラップしたことです。$.ajax将来的に別の方法で動作させるために呼び出しが必要であると判断した場合、または別のajaxメソッドを使用した場合、またはjQueryから離れた場合は、xhr_get定義を変更するだけです(必ず、promiseまたは少なくともdoneメソッドを返します)。上記の例の場合)。アプリ全体の他の参照はすべて同じままにすることができます。

$.Deferredを使用pipeすると、さらに多くの(はるかにクールな)ことができます。その1つは、$.ajax要求自体が成功した場合でも、サーバーによって報告されたエラーで失敗をトリガーするために使用することです。例えば:

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json'
  })
  .pipe(function(data) {
    return data.responseCode != 200 ?
      $.Deferred().reject( data ) :
      data;
  })
  .fail(function(data) {
    if ( data.responseCode )
      console.log( data.responseCode );
  });
}

xhr_get('/index').done(function(data) {
  // will not run if json returned from ajax has responseCode other than 200
});

詳細について$.Deferredは、http//api.jquery.com/category/deferred-object/をご覧ください。

:jQuery 1.8以降、まったく同じ方法pipeで使用thenするために非推奨になりました。


2
success:/ の相互作用はどのように.done()定義されているのでしょうか。たとえば、最近success:最初に実装されただけ.done()ですか?

6
あなたは両方を持っている場合は、意味success:.doneAJAX呼び出しに?良い質問。他のすべてのコールバックはバインドされた順序で呼び出されるため、私の推測では「はい」successが最初に呼び出されます。
グロート

1
とてもいい投稿です!ところで、パイプコールバックでは、ステータス応答を確認するために、jqXHRパラメーターを使用してパイプ関数を呼び出してはいけませんか?例:.pipe(function(data、textStatus、jqXHR){if(jqXHR.status == 200){...
Eder

@Ederこの使用で対処するシナリオpipeは、要求自体は成功するが、サーバー上のスクリプトが探しているものを返さなかったシナリオです。HTTP応答とアプリケーション応答を明確に区別したいので、サーバー側で実際の404や500などをスローしたくない場合があります。JSONで応答コードを設定してからpipeこの方法を使用すると、さまざまな種類のエラーをより微妙に処理できます。
グロート2014年

promiseを使用するもう1つの重要な利点は、コードがはるかに読みやすくなり、「コールバック地獄」を回避できることです。これは、前回の終了後にそれぞれ実行したいコールバックが複数ある場合に特に当てはまります。promiseでは、成功オプションで使用されるコールバックの複雑な構造がネストされているのではなく、myPromiseCall.then(..)。then(..)のようになります。
BornToCode 2017年

5

async: falseajaxで必要な場合は、のsuccess代わりに使用してください.done。それ以外の場合は、使用することをお勧めします.done。これはjQueryの公式サイトからです

jQuery 1.8では、jqXHR($ .Deferred)でのasync:falseの使用は非推奨です。jqXHR.done()などのjqXHRオブジェクトの対応するメソッドではなく成功/エラー/完了のコールバックオプションを使用する必要あります。


誰が言及しasync:falseますか?
リアム

$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
AmirHossein Manian

0

JQueryドキュメントから

$.ajax()jQuery 1.5以降にによって返されたjqXHRオブジェクトは、Promiseインターフェースを実装し、Promiseのすべてのプロパティ、メソッド、および動作を提供します(詳細については、遅延オブジェクトを参照してください)。これらのメソッドは、$.ajax()要求が終了したときに呼び出される1つ以上の関数引数を取ります。これにより、1つのリクエストに複数のコールバックを割り当てることができ、リクエストが完了した後でコールバックを割り当てることもできます。(リクエストがすでに完了している場合、コールバックはすぐに発生します。)jqXHRオブジェクトの利用可能なPromiseメソッドには、以下が含まれます。

jqXHR.done(function( data, textStatus, jqXHR ) {});

成功コールバックオプションの代替構成deferred.done()。実装の詳細については、を参照してください。

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});

エラーコールバックオプションの代替構成であるこの.fail()メソッドは、非推奨の.error()メソッドを置き換えます。実装の詳細については、deferred.fail()を参照してください。

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); 

(jQuery 1.6で追加)完全なコールバックオプションの代替構成であるこの.always()メソッドは、非推奨の.complete()メソッドを置き換えます。

リクエストが成功すると、関数の引数は.done()data、textStatus、jqXHRオブジェクトの引数と同じになります。失敗したリクエストの場合、引数は.fail()jqXHRオブジェクト、textStatus、およびerrorThrownの引数と同じです。deferred.always()実装の詳細については、を参照してください。

jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});

.done()および.fail()メソッドの機能を組み込み、(jQuery 1.8以降)基になるPromiseを操作できるようにします。.then()実装の詳細については、deferred を参照してください。

廃止のお知らせ:jqXHR.success()jqXHR.error()、およびjqXHR.complete()コールバックはjQueryの3.0のように除去されています。あなたは使用することができ jqXHR.done()jqXHR.fail()およびjqXHR.always()その代わり。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.