deferred处理蛋疼bug

处理同事的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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值