用$.when 必有resolve
ajax,则直接done,或$.when($.ajax()).done即可
when后 then代替done、fail更简洁
一般场景无需.promise(),如果deffered的被在外部resolve干扰 可考虑下
var dtd = $.Deferred(); // 新建一个deferred对象
var wait = function(dtd){
var tasks = function(){
alert("执行完毕!");
dtd.resolve(); // 改变deferred对象的执行状态
return ;//结束当前function,不再执行下方
alert('还在进行..');
};
setTimeout(tasks,5000);//延迟、异步类的命令代码
alert('1');
return;//结束也能触发$.when.done,但是因为没有return dtd
return dtd;//只有返回dtd,才会等待setTimeout里的.resolve()后执行when.done
};
$.when(wait(dtd))
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); });
也可以将事件和$.Deferred直接简写成下方的样式
$.when(function(){
var dtd = $.Deferred();//新建deferred对象,放到函数内 可防止外部干扰,代码更干净
var tasks = function(){
alert("执行完毕!");
dtd.resolve(); // 改变deferred对象的执行状态
return ;//终止当前函数里的下方代码
alert('还在进行..');
};
setTimeout(tasks,5000);
alert('1');
//此处加return; 则when得不到dtd对象,就无法等待Deferred
return dtd;//$.when只会通过deferred对象等待当前函数里的异步和延迟命令
}())
.then(function(){ alert("胜败在天了"); });
alert('我也完成了,等待when登场弹窗'); //非阻塞