success
は、jQueryの成功コールバックの伝統的な名前で、ajax呼び出しのオプションとして定義されています。しかし$.Deferreds
の実装とより洗練されたコールバックのため、deferred
で呼び出すことができるので、成功コールバックを実装するにはdone
が好ましい方法です。例えば
、成功例:
$.ajax({
url: '/',
success: function(data) {}
});
、行わ:
$.ajax({url: '/'}).done(function(data) {});
いいところ約done
$.ajax
の戻り値はにバインドすることができ、繰延約束が今あるということですアプリケーションのどこにでも置くことができます。だから、あなたはいくつかの異なる場所からこのajax呼び出しをしたいとしましょう。あなたのsuccess関数をこの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
メソッド、上記の例の場合)。アプリ全体の他のすべての参照は同じままにすることができます。
$.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
を使用しての賛成で廃止されました。
'success:'/'.done()'のやりとりが何であれ定義されているのだろうか。例えば。最近の最初の '.done()'として実装されたばかりの 'success:'でしょうか? –
ajax呼び出しで 'success:'と '.done'の両方があるとしたらどうですか?良い質問。他のすべてのコールバックはバインドされた順番で呼び出されるので、私の推測は「成功」だけが最初に呼び出されます。 – glortho
はい、それは実際にそうであるように思われます:http://jsfiddle.net/9L7dD/ – Adam