1. ホーム
  2. アジャックス

[解決済み】jQuery.ajaxのcontinueレスポンスの処理。"success:" vs ".done"?

2022-03-26 19:35:27

質問

私は数週間前からjQueryとAJAXを使用していますが、一度呼び出したスクリプトを「継続」する2つの異なる方法を目にしました。 success:.done .

のあらすじから。 jQueryのドキュメント を得ることができます。

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

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

つまり、どちらもAJAX呼び出しが完了/解決した後に何かを行うのです。どちらか一方をランダムに使ってもいいのでしょうか?また、どのような場合にどちらかの代わりに使用するのでしょうか?

どのように解決するのですか?

success は、jQueryにおける成功コールバックの伝統的な名前で、ajax呼び出しのオプションとして定義されています。しかし $.Deferreds と、より洗練されたコールバックがあります。 done は、サクセスコールバックを実装するのに適した方法で、任意の deferred .

例えば、success。

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

例えば、完了。

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

のいいところは done の返り値は $.ajax は遅延プロミスとなり、アプリケーション内の任意の場所にバインドすることができます。そこで、このajaxコールをいくつかの異なる場所から行いたいとします。このajax呼び出しを行う関数にオプションとして成功関数を渡すのではなく、関数が単に $.ajax を作成し、コールバックを done , fail , then といった具合です。ただし 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 の定義(必ずプロミスを返すか、少なくとも done メソッドを使用します)。アプリ内の他の参照はすべて同じでよい。

を使うと、もっとたくさんの(もっとクールな)ことができるんだ。 $.Deferred そのうちの1つは pipe を使用している場合でも、サーバーから報告されたエラーで失敗をトリガーすることができます。 $.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 を全く同じように使用することができます。