jQuery deferred 使用心得
因为项目的原因,我接触到了jQuery deferred 的这个神奇的工具,下面我用几个例子,与大家分享我的感悟。
我们有5个很耗时的函数 分别为fA、fB、fC、fD、fE 我们的需求是fA和fB同时执行,fA和fB都执行完了,就同时执行fC 和fD ,其中fC和fD只要有一个执行完了,就可以执行fE了。
先完成第一步,写5个函数,并加入deferred
function fA(){
var dtd = $.Deferred();
console.log('fa Start');
setTimeout(function(){
console.log('fa End');
dtd.resolve();
}, 2000);
return dtd.promise();
};
function fB(){
var dtd = $.Deferred();
console.log('fb Start');
setTimeout(function(){
console.log('fb End');
dtd.resolve();
}, 3000);
return dtd.promise();
};
22 /*** fC fD fE 省略 ***/
第二步, fA和fB都执行完了,然后XXX
先给出我的做法,我们需要用到$.when()这个函数 ,先看效果
$.when(fA(), fB()).done(function(){
console.log('when fA, fB is solved');
});
打开控制台:
fa Start
fb Start
fa End
fb End
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()吗? 按照刚刚的分析我试了一下,如下:
$.extend({
"myWhen": function(){
var args = arguments;
var dtd = $.Deferred();
var argLen = args.length;
var solveCount = 0;
var argSolve = function(){
if(solveCount >= (argLen - 1)){
dtd.resolve();
}else{
solveCount++;
}
}
$.each(args, function (i_dtd, v_dtd){
v_dtd.done(argSolve);
});
return dtd.promise();
}
});
调用也改成我们自己的方法:
$.myWhen(fA(), fB()).done(function(){
console.log('when fA, fB is solved');
});
打开控制台:
fa Start
fb Start
fa End
fb End
when fA, fB is solved
看来我们的myWhen 成功了。这个只是我们为了学习而造的轮子,下面的例子还是用$.when()
第三步,同时执行fC、fD,只要有一个成功就执行fE。
问题来了,$.when是与门开关,那么有没有或门开关呢?好像jquery还真没准备。不过我们有了上面造轮子的经验,相信应该很容易造一个$.myAtLeast()
"myAtLeast": function(){
var args = arguments;
var dtd = $.Deferred();
var hasResolve = false;
var solve = function(){
if(!hasResolve){
dtd.resolve();
}
};
$.each(args, function (i_dtd, v_dtd){
v_dtd.done(solve);
});
return dtd.promise();
}
调用一下试试:
$.when(fA(), fB()).done(function(){
console.log('when fA, fB has resolved');
$.myAtLeast(fC(), fD()).done(function(){
console.log('fC or fD has resolved');
fE();
});
});
打开控制台:
fa Start
fb Start
fa End
fb End
when fA, fB has resolved
fC Start
fD Start
fC End
fC or fD has resolved
fE Start
fD End
fE End
我们可以清楚的看到,fC End后, fE就执行了,随后fD才结束。
就此,我们实现了,一开始定义的需求。
写的仓促,望大家指出文章中不对的地方。谢谢!
jQuery deferred 使用心得的更多相关文章
- javascript源代码学习之五——jQuery.deferred
jQuery.Defered——异步队列用于管理一组回调函数(成功resolve,失败reject,消息progress),基于上一节实现的jQuery.callbacks完成. done,fail, ...
- JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析
一.前言 jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.ajax函数也做了相应的调整.因此我们能如下的使用xhr请求调用,并实现事件处理函数晚绑定. var p ...
- 深入分析,理解jQuery.Deferred源码
前言: 如果你对jQuery.Callback回调对象不了解,或者只掌握其方法,但是没有通过阅读源码理解,可以先阅读 前一章jQuery.Callbacks源码解读二,因为只有完全理解jQuery.C ...
- 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...
- jquery.Deferred promise解决异步回调
我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...
- 第三十四课:jQuery Deferred详解2
上一课主要分析了jQuery1.51版本的jQuery Deferred.在jQuery1.6中,jQuery Deferred添加了两个方法,always,pipe. always用来添加回调,无论 ...
- 第三十三课:jQuery Deferred详解1
之前我们讲了Mochikit Deferred,JSDeferred,现在讲jQuery Deferred.首先,我们先来讲下他们的区别: 在保存回调函数时,Mochikit Deferred(doj ...
- 使用 jQuery Deferred 和 Promise 创建响应式应用程序
这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首 ...
- 利用 Jquery Deferred 异步你的程序
最近在做公司QA系统改造时,有这样的一个场景. QA系统中有些数据项需要从JIRA平台(一个国外项目与事务跟踪工具)中获取,JIRA平台提供了很完善的Rest API. 现在的要求是,在QA系统中提交 ...
随机推荐
- “随机数”函数的 ES6 实现
生成一个指定长度的数字数组 const getNumArray = len => [...new Array(len).keys()]; const getNumArray = len => ...
- VS 开发中觉得不错的几款插件
1.C# Outline 2013 {}折叠 2.Indent Guides:为缩进添加竖直线 3.ResXManager:多语言资源文件编辑 4.C# Formatter:代码清理 5.Highl ...
- Object类中有哪些方法
equals().hashCode().wait().notify().notifyAll().toString().clone().getClass().finalize()
- Java 读写Properties配置文件【转】
1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形式来保存属性集.不过Properties有特殊的地 ...
- Python + Selenium 练习篇 - 获取页面所有邮箱
代码如下: # coding=utf-8import re #python中利用正则,需要导入re模块from selenium import webdriverdriver = webdriv ...
- poi 详细demo
import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IO ...
- C# a == b ? c :d 表示的意思
a==b 为true,这个表达式返回c; a==b为false,这个表达式返回d. 相当于: if(a == b) { return c; } else { return d; }
- PlayMaker 设置颜色 Set Materia lColor
1. 指定一个游戏对象,Color处设为红色,执行这个行为后就把游戏对象的材质变为了红色: 2. Color也可以使用一个弄好的Color类型的变量,如下图:Color处用了一个提前设置好的变量
- docker~service将容器日志输出到fluentd
我们把微小的服务发布到docker里,然后实现docker service启动它,保证了服务的高可用性,然后把服务产生的日志输出到fluentd,由它进行过滤和转发,存储到elasticsearch里 ...
- EasyUI 数据网格 - 设置排序并自定义排序
数据网格(DataGrid)的所有列可以通过点击列表头来排序.您可以定义哪列可以排序.默认的,列是不能排序的,除非您设置 sortable 属性为 true. 当排序时,数据网格(DataGrid)将 ...