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系统中提交 ...
随机推荐
- docker+ bind mount 部署复杂flask应用
报错如下: [root@test-wenqiang flask-skeleton]# docker run -d -p 80:5000 -v $(pwd):/skeleton --name flask ...
- 数据结构---Java---HashMap
1.概述 [hash冲突]: 对某个元素进行哈希函数运算,得到一个地址值,要进行插入时,发现此地址被占用,称为hash冲突(哈希碰撞): [hash冲突解决]: 开放定址(发生冲突,继续寻找下一块未被 ...
- Win2003 控制面板 打不开
windown 2003 控制面板打不开 在运行框中输入regedit,进入注册表中的 HKEY_LOCAL_MACHINE/SYSTEM\Current ControlSet\Control\NLS ...
- linux 安装dubbo+zookeeper
dubbo+zookeeper 启动成功 注意:dubbo-admin-2.5.4 不支持java8
- WSGI学习系列多种方式创建WebServer
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) ...
- 使用 Charles 获取 https 的数据
1. 配置 Charles 根证书 首先打开 Charles: 然后如下图操作: 之后会弹出钥匙串,如果不弹出,请自行打开钥匙串,如下图: 系统默认是不信任 Charles 的证书的,此时对证书右键, ...
- Oozie安装部署
不多说,直接上干货! 首先,大家先去看我这篇博客.对于Oozie的安装有一个全新的认识. Oozie安装的说明 我这里呢,本篇博文定位于手动来安装Oozie,同时避免Apache版本的繁琐编译安装,直 ...
- stm32 窗口看门狗学习(一)
什么是窗口看门狗? 1)独立看门狗 限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗 之所以称为窗口就是因为其 ...
- 工作空间造成的javaweb项目无法新建
出现问题: 当我打开myeclipse开发工具将原有的已经存在的一个名为jeecms的项目删除的时候,出现了删除不了,因此我采取了强制的删除的方法,最终项目删除了.接下来新建同名的javaweb就出现 ...
- Python札记1--基础
Python语言虽然简单,但相关的细节仍需要注意,本系列札记,旨在记录学习python过程中需要注意的相关知识点或相关难点的理解. 1. 列表 a. python的列表list中元素的类型可以不同 b ...