在jquery1.5版本以后,Deferred和promise就是jquery中非常常用的两个功能,并且在这个版本利用Deferred又完全重写了ajax模块。Deferred对象是有jquery.Deferred构造的,$.Deferred在jquery代码中,分别在promise方法、Dom ready、ajax模块、动画模块被使用
Deferred的用法
var defer = $.Deferred();
function aaa(){
console.log("aaa");
defer.resolve();//完成态 相当于callbacks中的fire
}
aaa();
//相当于callbacks中的add方法 通过done改变状态
defer.done(function(){
console.log('success');
});
var defer = $.Deferred();
function runAsync(){
setTimeout(function(){
console.log('执行完成');
defer.resolve('data');
},2000)
return defer.promise();
}
defer.done(function(data){
console.log(data);
})
defer.fail(function(data){
console.log(data);
})
var d = runAsync();
d.done(function(data){
console.log(data);
})
d.then(function(data){
console.log(data);
})
这里需要说明一下deferred和promise的区别,deferred相当于promise的继承类,相比于promise方法,deferred可以通过resolve、reject和 notify改变回调的状态,而promise不能修改回调的状态
$.Deferred的实现
异步队列的方法
添加回调函数方法
- deferred.done(doneCallbacks[,doneCallbacks]):添加成功回调函数,当异步队列处于成功状态时被调用
- deferred.fail(failCallbcks[,failCallbacks]): 添加失败回调函数,当异步队列处于失败状态时被触发
- deferred.progress(progressCallbacks):添加消息回调函数
- deferred.then(doneCallbacks,failCallbacks[,progressCallbacks]): 添加成功回调函数、失败回调函数、消息回调函数
- deferred.always(alwaysCallbacks[,alwaysCallbacks]):添加回调函数,当异步队列处于成功或失败状态时调用
执行回调函数方法
- deferred.resolve(args): 使用指定的参数调用所有的成功回调函数
- deferred.resolveWith(context[,args]): 使用指定的上下文和参数调用所有的成功回调函数,异步队列进入成功状态
- deferred.reject(args): 使用指定的参数调用所有失败回调函数,异步队列进入失败状态
- deferred.rejectWith(context[.args]: 使用指定的上下文和参数调用所有失败回调函数,异步对垒进入失败状态
- deferred.notify(args): 使用指定的参数调用所有的消息回调函数