自 jQuery 1.5(2011 年 1 月)以来执行此操作的“新”方法是使用延迟对象而不是传递success
回调。您应该返回结果,$.ajax
然后使用.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 动画与其他异步操作同步。