自从jQuery 1.5(2011年1月)以来,这样做的“新”方法是使用延迟对象而不是传递success
回调。您应该返回的结果,然后使用.done
,.fail
等方法在$.ajax
之外添加回调调用。
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */) {
alert(data);
//do some stuff
}
getData().done(handleData);
这解耦回调从AJAX处理处理,使您可以添加多个回调,回调失败,等等,所有甚至无需修改原始getData()
功能。将AJAX功能与之后要完成的一组操作分开是一件好事!。
Deferreds还允许多个异步事件,你不能轻易地只是success:
做。例如,我可以添加多个回调,错误处理程序要容易得多同步,并等待计时器逝去然后再继续:
// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);
// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);
$.when(timer, ajax).done(function() {
// this won't be called until *both* the AJAX and the 5s timer have finished
});
ajax.done(function(data) {
// you can add additional callbacks too, even if the AJAX call
// already finished
});
的jQuery的其他部分使用延迟对象太 - 你可以很容易的与他们同步jQuery的动画与其他异步操作。
传递'success'回调是_so_ 2010 ... – Alnitak
@Alnitak,什么时候延迟对象被引入了?我以前没有见过。此外,它看起来有些杂乱,因为定义使用哪个回调的代码与实际的AJAX调用位于不同的位置。 – Cerbrus
它是在jQuery 1.5中引入的,与使用'success:'相比,它更不笨乱。将回调与AJAX解耦是一件好事!看到我刚刚添加到我的答案结束的笔记。 – Alnitak