jQuery deferred 使用心得

因为项目的原因,我接触到了jQuery deferred 的这个神奇的工具,下面我用几个例子,与大家分享我的感悟。

我们有5个很耗时的函数 分别为fA、fB、fC、fD、fE  我们的需求是fA和fB同时执行,fA和fB都执行完了,就同时执行fC 和fD ,其中fC和fD只要有一个执行完了,就可以执行fE了。

先完成第一步,写5个函数,并加入deferred

 1 function fA(){
 2         var dtd = $.Deferred();
 3         console.log(‘fa Start‘);
 4         setTimeout(function(){
 5             console.log(‘fa End‘);
 6             dtd.resolve();
 7         }, 2000);
 8         return dtd.promise();
 9     };
10
11     function fB(){
12         var dtd = $.Deferred();
13         console.log(‘fb Start‘);
14         setTimeout(function(){
15             console.log(‘fb End‘);
16             dtd.resolve();
17
18         }, 3000);
19         return dtd.promise();
20     };
21
22     /***    fC fD fE 省略  ***/

第二步, fA和fB都执行完了,然后XXX

先给出我的做法,我们需要用到$.when()这个函数  ,先看效果

1     $.when(fA(), fB()).done(function(){
2         console.log(‘when fA, fB is solved‘);
3     });

打开控制台:

1 fa Start
2 fb Start
3 fa End
4 fb End
5 when fA, fB is solved

有个问题: $.when()是什么

$.when() ,给出API文档的地址  http://www.css88.com/jqapi-1.9/jQuery.when/

$.when() 就是接受一个或多个deferred(延迟)对象作为参数, 返回一个deferred(延迟)对象,参数中的deferred对象的状态都变成resolve。就将返回值的状态置为resolve。简单来说,就是坚挺多个deferred回调,都成功,就调用成功的回调(dtd.done())我的理解就是一个deferred的异步‘与门’开关。

延伸一下,我们能自己实现一下$.when()吗? 按照刚刚的分析我试了一下,如下:

 1 $.extend({
 2     "myWhen": function(){
 3         var args = arguments;
 4         var dtd = $.Deferred();
 5         var argLen = args.length;
 6         var solveCount = 0;
 7
 8         var argSolve = function(){
 9             if(solveCount >= (argLen - 1)){
10                 dtd.resolve();
11             }else{
12                 solveCount++;
13             }
14         }
15
16         $.each(args, function (i_dtd, v_dtd){
17             v_dtd.done(argSolve);
18         });
19
20         return dtd.promise();
21     }
22 });

调用也改成我们自己的方法:

1 $.myWhen(fA(), fB()).done(function(){
2        console.log(‘when fA, fB is solved‘);
3 });

打开控制台:

fa Start
fb Start
fa End
fb End
when fA, fB is solved

看来我们的myWhen 成功了。这个只是我们为了学习而造的轮子,下面的例子还是用$.when()

第三步,同时执行fC、fD,只要有一个成功就执行fE。

问题来了,$.when是与门开关,那么有没有或门开关呢?好像jquery还真没准备。不过我们有了上面造轮子的经验,相信应该很容易造一个$.myAtLeast()

 1 "myAtLeast": function(){
 2         var args = arguments;
 3         var dtd = $.Deferred();
 4         var hasResolve = false;
 5         var solve = function(){
 6             if(!hasResolve){
 7                 dtd.resolve();
 8             }
 9         };
10         $.each(args, function (i_dtd, v_dtd){
11             v_dtd.done(solve);
12         });
13         return dtd.promise();
14     }

调用一下试试:

1     $.when(fA(), fB()).done(function(){
2         console.log(‘when fA, fB has resolved‘);
3         $.myAtLeast(fC(), fD()).done(function(){
4             console.log(‘fC or fD has resolved‘);
5             fE();
6         });
7     });

打开控制台:

 1 fa Start
 2 fb Start
 3 fa End
 4 fb End
 5 when fA, fB has resolved
 6 fC Start
 7 fD Start
 8 fC End
 9 fC or fD has resolved
10 fE Start
11 fD End
12 fE End

我们可以清楚的看到,fC End后, fE就执行了,随后fD才结束。

就此,我们实现了,一开始定义的需求。

写的仓促,望大家指出文章中不对的地方。谢谢!

时间: 2024-08-16 20:25:18

jQuery deferred 使用心得的相关文章

jquery Deferred

jquery Deferred使用经验 这周做了个小活动(http://aoqi.100bt.com/zt-2016duanzi/index.html),刚开始时候没看好需求,逻辑都写一块了 最后各种坑要填补,从中也获取了些经验和教训,下面说说这里会用到的$.Deferred: 关于jquery里面的deferred的基本使用方法,阮一峰大婶已经有文章说明了,链接如下: http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_o

javascript --- jQuery --- Deferred对象

javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应词典:v.迁延:听从:扣存:[军]使延期入伍所以deferred对象的含义就是"延迟"到未来某个点再执行. jQuery的官方文档给出了用jQuery.ajax()发送请求的基本方式http://api.jquery.com/jQuery.ajax/Example: Save some d

jquery.Deferred promise解决异步回调

我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越深,代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol

jQuery异步框架探究2:jQuery.Deferred方法

(本文针对jQuery1.6.1版本)关于Deferred函数的描述中有一个词是fledged,意为"羽翼丰满的",说明jQuery.Deferred函数应用应该更成熟.这个函数与jQuery._Deferred函数有密不可分的关系. 1 内部实现 Deferred: function( func ) { var deferred = jQuery._Deferred(), failDeferred = jQuery._Deferred(), promise; // Add error

第三十三课:jQuery Deferred

之前我们讲了Mochikit Deferred,JSDeferred,现在讲jQuery Deferred.首先,我们先来讲下他们的区别: 在保存回调函数时,Mochikit Deferred(dojo Deferred)是用一个2维数组保存的,里面的小数组只有两项,一个是成功回调的函数,一个是失败回调的函数. JSDeferred则每个实例都必有ng,ok这两个回调函数. jQuery Deferred则一个_Deferred负责添加成功回调,一个负责添加错误回调. 它们的API区别如下图:

JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析

一.前言 jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.ajax函数也做了相应的调整.因此我们能如下的使用xhr请求调用,并实现事件处理函数晚绑定. var promise = $.getJSON('dummy.js') // 其他逻辑处理 promise.then(function(){ alert('late binding') }) 我还一度以为这就是Promises/A+规范的实现,但其实jQuery.Deferred应该与jsDeferred归为

jquery.tmplate使用心得

jquery.tmplate使用心得 jquery.tmpl.js,是与jquey共同使用的html模板插件.该插件可通过简单的语法将数据放入到html模板中,可以很好的将数据渲染到页面上.该插件在本项目中使用较多且网上的讲解比较分散,无系统的api以及使用方法可以查询,故将jquery.tmpl.js的api整理出来,以方便大家使用.        在使用之前一定要先加载jquery,并把jquery.tmpl.js加载进来        一.目前使用比较多的api如下:        1.判

jquery deferred done then区别

jquery deferred done then区别 deferred是jquery 对promise的实现. 以下内容基于jquery 1.8及以上版本 deferred具有then done等属性.其区别在于Deferred resolved时, done返回当前的的deferred object,callback的返回值不会被传递 then返回一个新的deferred object,callback的返回值会被传递(参考jquery的pipe属性)给新的callback 通过以下的例子来

javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式

我们先来看一下编写AJAX编码常常遇到的几个问题: 1.因为AJAX是异步的,全部依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套.ajax等异步操作越多,嵌套层次就会越深.代码可读性就会越差. $.ajax({ url: url, data: dataObject, success: function(){ console.log("I depend on ajax result."); }, error: function(){} }); consol