首先列出以下会涉及到的,该对象的一些方法的使用或相关联的其他方法,
- deferred.done()
- deferred.fail()
- deferred.catch()
- deferred.then()
- $.when()
- deferred.notify()
- deferred.progress()
- deferred.resolve()
- deferred.reject()
- deferred.always()
Deferred对象是Jquery 1.5版本以后添加进去的,直译为 延迟对象,是为了解决回调函数的一个方案,所有的回调函数都会针对这个对象进行处理
$.ajax()操作完成后,如果使用的是低于1.5.0版本的jQuery,返回的是XHR对象,你没法进行链式操作;如果高于1.5.0版本,返回的是deferred对象,可以进行链式操作。
在旧版本的JQ 里面,写回调函数是这样的:
$.ajax({
success:function(){},
error:function(){}
})
所有的回调函数都写在参数里面。而新版本的JQ,则默认AJAX请求返回的是一个Deferred对象,这样我们就能做链式操作,像这样:
$.ajax({}).done(function(){}).fail(function(){})
Deferred “延迟”就是为了解决 异步回调的问题。
异步操作,除了AJAX请求以外,还有setimeout,setinterval以及其他触发事件,都属于异步操作。具体的Deferred对象的意义请自行了解。直接进入这个对象的各个方法:
done
done方法在deferred对象解决(deferred.resolve())之后的执行,相当于AJAX以前的successfail
deferred.reject()之后执行,相当于ajax的errorcatch()
个人还没区分它与fail的区别。。。- then()
then有两个参数then(Function ,Function)第一个对应done,第二个对应fail,所以只有一个函数作为参数的时候等同于done - $.when()
when是为了使多个异步操作绑定同一个回调函数
$.when($.ajax(),$.ajax(),...).done(function(){}).fail(function(){})
//只有当所有的请求都完成后才会执行后面的done方法,只要存在一个没有完成,都不会执行
- notify(), progress()
notify是通知progress中的回调函数,如:
var notifyDeferred=$.Deferred();
notifyDeferred.progress(function(cur){
console.log('当前进度:'+cur+'%');
});
var wait=function(){
var def=$.Deferred();
var tasks = function(){
notifyDeferred.notify(100);
def.resolve();
};
setTimeout(tasks,5000);
return def.promise();
}
var wait2=function(def){
var def=$.Deferred();
notifyDeferred.notify(50);
def.resolve();
return def.promise();
}
$.when(wait(),wait2()).done(function(){
console.log('进度提醒完成')
}).fail(function(){
console.log('未全部完成')
})
- resolve()
将deferred对象状态更改为已解决 - reject()
将deferred对象状态更改为未解决 - always()
无论延迟对象最终结果都会执行这个函数