参考 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
从jQuery1.5版本之后 ajax方法进行了重写,和以前不一样了。如今$.ajax()将返回一个Promise/Deffered对象
这个对象里面有done() fail() always() then() promise() reject()等方法
以前发ajax这么写
$.ajax({
url: "test.html",
success: function(){
alert("哈哈,成功了!");
},
error:function(){
alert("出错啦!");
}
});
现在则是
$.ajax({
url: ‘/path/to/file‘,
type: ‘default GET (Other values: POST)‘,
dataType: ‘default: Intelligent Guess (Other values: xml, json, script, or html)‘,
data: {param1: ‘value1‘},
}).done(function() {
console.log("success");
}).fail(function() {
console.log("error");
}).always(function() {
console.log("complete");
});
很显然,done()相当于success() fail()就是error()
或者
$.ajax({
url: ‘test1.json‘,
dataType: ‘text‘,
}).then(function(res){
alert(‘wahha‘);
console.log(res);
});
可以为不同的请求使用相同的回调
$.when($.ajax({
url: ‘test1.json‘,
dataType: ‘text‘,
}),$.ajax({
url: ‘test2.json‘,
dataType: ‘text‘,
})).done(function(res){
alert(‘wahha both‘);
console.log(res);//第一个ajax请求的响应
})
为普通函数增加回调函数
这是最建议的方式
var wait = function(dtd){
var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
var tasks = function(){
alert("执行完毕!");
dtd.resolve(); // 改变Deferred对象的执行状态 resolve表示解决
};
setTimeout(tasks,5000);
return dtd.promise(); // 返回promise对象
};
$.when(wait())
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); });
源博文先前是将$.Deferred() 当做全局对象,不过那样可以在全局中改变执行的状态。
因此他又用了deferred.promise()
最后用到了是将deferred放在函数内,解决了这个问题
所以以后多个嵌套的ajax请求可以这么写
var promiseA = $.get(urlA);
promiseA.always(doneFnA, failFnA, progressFnA);
var promiseB = promiseA.then(function(){
return $.get(urlB);
});
promiseB.always(doneFnB, failFnB, progressFnB);