2012-01-12 18 views
264

私は数週間前からjQueryとAJAXで作業していましたが、コールが完了したらスクリプトを続けるために2通りの方法がありました:success:.done。我々が得るjQuery documentationから概要から jQuery.ajax処理を続行します。「成功:」と「完了」。

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

成功:(.ajax()オプション):要求が成功した場合に呼び出される関数。

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

答えて

399

successは、jQueryの成功コールバックの伝統的な名前で、ajax呼び出しのオプションとして定義されています。しかし$.Deferredsの実装とより洗練されたコールバックのため、deferredで呼び出すことができるので、成功コールバックを実装するにはdoneが好ましい方法です。例えば

、成功例:

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

、行わ:

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

いいところ約done$.ajaxの戻り値はにバインドすることができ、繰延約束が今あるということですアプリケーションのどこにでも置くことができます。だから、あなたはいくつかの異なる場所からこのajax呼び出しをしたいとしましょう。あなたのsuccess関数をこの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の定義を変更するだけで済みます(約束を返すか、少なくともdoneメソッド、上記の例の場合)。アプリ全体の他のすべての参照は同じままにすることができます。

$.ajax要求自体が成功した場合でも、サーバーによって報告されたエラーの障害を引き起こすためにpipeを使用してそのうちの1つはあなたが$.Deferredで行うことができます(多くのクーラー)より多くのものがあります。たとえば:

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()'のやりとりが何であれ定義されているのだろうか。例えば。最近の最初の '.done()'として実装されたばかりの 'success:'でしょうか? –

+5

ajax呼び出しで 'success:'と '.done'の両方があるとしたらどうですか?良い質問。他のすべてのコールバックはバインドされた順番で呼び出されるので、私の推測は「成功」だけが最初に呼び出されます。 – glortho

+1

はい、それは実際にそうであるように思われます:http://jsfiddle.net/9L7dD/ – Adam

2

あなたのajaxにasync: falseが必要な場合は、.doneの代わりにsuccessを使用してください。それ以外の場合は.doneを使用することをお勧めします。 これはjQuery official siteからです:

非同期の使用jQueryの1.8、のとおり:jqXHR($ .Deferred)と偽が廃止されました。あなたは成功/エラー/完全コールバックオプション代わりの jqXHRオブジェクトなどjqXHR.done()の対応するメソッドを使用する必要があります。

関連する問題