处理同事的bug:更新对象状态,类似a,然后又执行一大串后台ajax请求类似b,奇葩的是还要还原对象的状态,就是c,情况就是b没执行完,c已经执行完了,需要用的状态也被更改了
参考
http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script type="text/javascript">
function a(){
console.info(1);
}
function b(){
console.info(2);
}
function c(){
console.info(3);
}
try
{
a();
setTimeout('b()',1000);
}finally{
c();
}
</script>
</head>
<body>
</body>
</html>
形如上面,需要代码执行成功应该是打印1,2,3,b模拟的ajax耗时操作
解决:如果执行错误则在每一个函数中返回
<span style="font-family:微软雅黑, MS Sans Serif, sans-serif;">dtd.<span style="color:#ffffff;"><span style="line-height: 18px;">reject</span></span></span>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<script src="http://libs.baidu.com/jquery/1.7.2/jquery.js"></script>
<script type="text/javascript">
var wait1=function a(dtd){
var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
console.info(1);
dtd.resolve(); // 改变Deferred对象的执行状态
return dtd.promise(); // 返回promise对象
}
var wait2= function b(dtd){
var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
var tasks = function(){
alert("执行完毕!");
dtd.resolve(); // 改变Deferred对象的执行状态
};
setTimeout(tasks,5000);
return dtd.promise(); // 返回promise对象
}
var wait3= function c(dtd){
var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
console.info(3);
dtd.resolve(); // 改变Deferred对象的执行状态
return dtd.promise(); // 返回promise对象
}
$(function(){
//假设wait1是去改变状态了,wait2是耗时操作,wait3是最后的更新回来,则不需要wait3在always中执行就行了
$.when(wait1(),wait2(),wait3())
.done(function(){ alert("哈哈,成功了!"); })
.fail(function(){ alert("出错啦!"); })
.always(function(){alert("已经执行了");});
});
</script>
<!--<script type="text/javascript">
$.ajaxSetup({
async: false
});
$(function(){
try
{
a();
//setTimeout('b()',1000);
$("#result").load("http://www.baidu.com");
}finally{
c();
}
});
</script>-->
</head>
<body>
<div id="result"></div>
</body>
</html>