介绍jquery 的deferred由来
它是jquery1.5版本的新出的功能,为了解决异步回调的问题。大概2011年就出来了。现在es6规范中的promise,基本和deferred对象是一个概念。
定义deferred对象
var deferred1 = $.Deferred();//这样就创建了一个deferred对象
deferred.done(sucessfn); //定义d1成功后的回调函数
deferred.fail(failfn); //定义d1失败后的回调函数
每一个deferred对象,有三种状态
- 正在处理中:
- 成功状态:
- 失败状态:
当deferred对象被resolve/reject触发之后,就会改变状态,然后调用不同状态下的函数。
//从正在处理的状态变为成功状态,callback done,
deferred1.resolve();
//从正在处理的状态变为失败状态,callback fail,
deferred1.reject();
以上就是deferred的基本用法,简单说来。就是可以让我们认为控制一个对象成功失败的状态。看到这里,好像没觉得它有多牛逼。
deferred对象解决了什么问题?~~
1.ajax对象,易读性
-
jquery1.5版本重写了$.ajax对象,$.ajax的返回值全是deferred对象。用done和fail来表示成功或者失败。
var deferred2 = $.ajax("test.html") .done(function(){ alert("哈哈,成功了!"); }) .fail(function(){ alert("出错啦!"); });
-
为一个deferred对象,添加多个回调处理函数,且按照添加的顺序执行
deferred2.done(sucessfn 1) .done(sucessfn 2)
-
解决异步金字塔回调 $.when()
想想这样的业务场景,有三个及以上异步请求的时候,如何保证3个请求都成功之后,在执行一个函数呢?$.ajax({ success: $.ajax({}) //只能通过回调成功的函数里,嵌套ajax请求 }) //通过计数器来实现,但是每个回调成功的函数,都要检查当前的计数 var flag = 0; $.ajax({ success: flag++ if(flag == 3){ //3个请求已成功 } }) //只有当两个ajax都成功的时候,才调用done的回调函数。 $.when($.ajax1,$.ajax2) .done(f1) .fail(f2)
特别注意:when函数,只接受deferred对象哦!!!!
-
简单写法 then方法,直接把done状态和fail状态都写进去
deferred1.then(donefunc,failfunc);
网友评论