因为项目的原因,我接触到了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 使用心得的更多相关文章

  1. javascript源代码学习之五——jQuery.deferred

    jQuery.Defered——异步队列用于管理一组回调函数(成功resolve,失败reject,消息progress),基于上一节实现的jQuery.callbacks完成. done,fail, ...

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

    一.前言 jQuery.Deferred作为1.5的新特性出现在jQuery上,而jQuery.ajax函数也做了相应的调整.因此我们能如下的使用xhr请求调用,并实现事件处理函数晚绑定. var p ...

  3. 深入分析,理解jQuery.Deferred源码

    前言: 如果你对jQuery.Callback回调对象不了解,或者只掌握其方法,但是没有通过阅读源码理解,可以先阅读 前一章jQuery.Callbacks源码解读二,因为只有完全理解jQuery.C ...

  4. 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

    Deferred 和 Promise ES6 和 jQuery 都有 Deffered 和 Promise,但是略有不同.不过它们的作用可以简单的用两句话来描述 Deffered 触发 resolve ...

  5. jquery.Deferred promise解决异步回调

    我们先来看一下编写AJAX编码经常遇到的几个问题: 1.由于AJAX是异步的,所有依赖AJAX返回结果的代码必需写在AJAX回调函数中.这就不可避免地形成了嵌套,ajax等异步操作越多,嵌套层次就会越 ...

  6. 第三十四课:jQuery Deferred详解2

    上一课主要分析了jQuery1.51版本的jQuery Deferred.在jQuery1.6中,jQuery Deferred添加了两个方法,always,pipe. always用来添加回调,无论 ...

  7. 第三十三课:jQuery Deferred详解1

    之前我们讲了Mochikit Deferred,JSDeferred,现在讲jQuery Deferred.首先,我们先来讲下他们的区别: 在保存回调函数时,Mochikit Deferred(doj ...

  8. 使用 jQuery Deferred 和 Promise 创建响应式应用程序

    这篇文章,我们一起探索一下 JavaScript 中的 Deferred 和 Promise 的概念,它们是 JavaScript 工具包(如Dojo和MochiKit)中非常重要的一个功能,最近也首 ...

  9. 利用 Jquery Deferred 异步你的程序

    最近在做公司QA系统改造时,有这样的一个场景. QA系统中有些数据项需要从JIRA平台(一个国外项目与事务跟踪工具)中获取,JIRA平台提供了很完善的Rest API. 现在的要求是,在QA系统中提交 ...

随机推荐

  1. UGUI [TextArea]

  2. [转]25个HTML5和JavaScript游戏引擎库

    本文转自:http://www.open-open.com/news/view/27c6ed 1. The GMP JavaScript Game Engine GMP是一个基于精灵2-D游戏,它可以 ...

  3. Windows 10 JDK安装及环境配置(vim+gcc)

    JDK安装 首先去官网下载JDK:点击进入 下载后点击安装: 中途会提示安装jre,注意jre的安装文件夹和jdk的不能相同,不然会覆盖掉jdk里面的jre文件.可以创建一个Java文件夹.将jdk和 ...

  4. Ubuntu14.04-PXE搭建

    什么是PXE? PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从 ...

  5. stm32串口学习(一)

    串口在工作中经常用到,今天我们从零开始学习stm32的串口编程(利用库函数). 先从最简单的情况开始,假设我们要实现的功能就是串口发送一个字节,不考虑接收,也不考虑中断. 那么要解决两个问题: 1 串 ...

  6. pop协议,邮件密码嗅探 使用说明

    思路与源代码 可以查看 https://www.cnblogs.com/likehc/p/10140174.html 因为软件用的是Wincap,所以 第一步安装下 WinPcap 第二步,打开 sn ...

  7. JS动态创建SVG元素并绑定事件

    var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); svg.set ...

  8. python 3.6 链接mssql 进行数据操作

    #!/usr/bin/env python # -*- coding: UTF-8 -*- import pymssql class MSSQL(object): ''' 对pymssql的简单封装 ...

  9. qingdao

    1001 #include <bits/stdc++.h> using namespace std; vector<long long> v; long long pow2(l ...

  10. Hibernate课程 初探一对多映射3-4 双向多对一的测试

    1 单向多对一和单向多对一的区别 比如部门和员工,一个部门下有很多员工,如果只查一个员工属于哪个部门,就用单向的,如果还要查一个部门下的所有员工,就用双向的. 2 双向多对一的配置 除了单向xml和双 ...