$ .ajaxの成功と.done()メソッドの違いは何ですか


102

誰か助けてもらえますか?
私は違いを理解することはできませんよsuccess.done()$.ajax

可能であれば例を挙げてください。


$ .ajax()のdone()メソッドについてどこで読みましたか?私の知る限り、doneメソッドは$ .Deferredオブジェクトに関連しています。たぶん、代わりに.complete()について話していますか?
Fabrizio Calderan


2
OK、それはjQuery 1.8です:) $ .ajaxはjQuery 1.5からのpromiseを返すので、これは一貫性の問題の単純な置換です(遅延のインターフェイスを使用):エラーの場合は成功()、失敗()の代わりに完了() ()およびalways()for complete()
Fabrizio Calderan 2012年

2
実際の変更点は、プログラムで複数のコールバックをアタッチできることです。$ .Deferredのドキュメントページをご覧ください。
Fabrizio Calderan 2012年

回答:


8

つまり、成功コールバック関数をajax関数から分離することで、後で元のコード(オブザーバーパターン)を変更せずに独自のハンドラーを追加できます。

こちらから詳細情報をご覧くださいhttps : //stackoverflow.com/a/14754681/1049184


1
そしてその下の例では、done =>成功、fail =>エラー、そして常に=> completeの等価性を示しています
StuartLC

25
この答えは要点を逃しています。でのsuccess: パラメータと.success()メソッドの使用には違いがありますjqXHR。後者は非推奨ですが、前者はOPが求めていたものです。
アルニタク

2
成功/エラー/完了は非推奨であり、AJAX状態の変更に基づいています。done / fail / alwaysは、jQuery Deferredの状態変更に基づいています。api.jquery.com/category/deferred-objectを参照してください。
mickeyreiss、

28
質問を誤って解釈するという答えは、最高の投票と受け入れられた解決策の両方です...
Transcendence

108

successAJAX呼び出しが成功した場合にのみ起動します。つまり、最終的にHTTP 200ステータスを返します。error失敗したcomplete場合、および成功に関係なくリクエストが終了したときに発生します。

上のjQueryの1.8でjqXHRオブジェクト(によって返された$.ajaxsuccessで置き換えたdoneerrorfailcompleteを有しますalways

ただし、古い構文でAJAXリクエストを初期化できるはずです。したがって、これらは同様のことを行います:

// set success action before making the request
$.ajax({
  url: '...',
  success: function(){
    alert('AJAX successful');
  }
});

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function() { alert("success"); });

この変更は、jQuery 1.5の遅延オブジェクトとの互換性のためです。据え置き(現在Promise、ChromeとFXで完全なネイティブブラウザーサポートを備えている)を使用すると、非同期アクションをチェーンできます。

$.ajax("parent").
    done(function(p) { return $.ajax("child/" + p.id); }).
    done(someOtherDeferredFunction).
    done(function(c) { alert("success: " + c.name); });

この一連の関数は、で取得するコールバックのネストされたピラミッドよりも維持が簡単ですsuccess

ただし、代わりにを使用doneするPromise構文が優先されるようになりましたthen

$.ajax("parent").
    then(function(p) { return $.ajax("child/" + p.id); }).
    then(someOtherDeferredFunction).
    then(function(c) { alert("success: " + c.name); }).
    catch(function(err) { alert("error: " + err.message); });

これは採用する価値があります。これはasyncawait拡張機能によって構文(およびエラー処理)が改善されるためです。

try {
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);
}
catch(err) { 
    alert("error: " + err.message); 
}

リクエストを行う前に関数を作成し、リクエストを行った後に関数を設定します。両方が同じように見えます...他の違いを見せてくれますか???
suhailvs 2013

@suhail-実際にはありません。jQuery 1.6ではがありsuccess、jQuery 1.8ではに置き換えられましたdone。これらは同じように機能しますがdone、他のjQueryとの一貫性が高くなっています。
キース

@キース、今日、.doneを使用することは、成功を使用することと同じですか?それとももっと新しいものがありますか?
Roxy'Pro

@ Roxy'Proこれは私が答えたときに時代遅れでした、私は確かに2018年に.doneはこれを使用しませんでしたPromise。新しいプロジェクトではconst response = await fetch(...)代わりに使用します。
キース

6

.success() Webサーバーが200 OK HTTPヘッダーで応答する場合にのみ呼び出されます-基本的にすべてが問題ない場合。

done()にアタッチされたコールバックは、遅延オブジェクトが解決されると発生します。fail()にアタッチされたコールバックは、遅延オブジェクトが拒否されたときに発生します。

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

3
不正な形式のJSONが200 / OKステータスコードで返された場合、.success()は呼び出されないことに注意してください。具体的には、NaN値を生成し、それらを実際には有効なJSONではないjavascript NaN(つまり、文字列 'NaN'ではなくシンボル)としてシリアル化するWebサーバーバックエンドコードで問題が発生したため、応答をJSONとして解析します失敗して.fail()が実行されますが、応答ステータスは200です。ただし、成功ステータスがOKステータスコードでのみ呼び出されることは依然として事実です。大丈夫だからといって指摘したかっただけで、それが「成功」したわけではありません;)
Kasapo

1

successリクエストが成功したときに呼び出されるコールバックで、$.ajax呼び出しの一部です。doneは実際にjqXHRはによって返されるオブジェクトの一部であり、jQuery 1.8で$.ajax()置き換えsuccessられます。

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