我们说jquery1.5之后用的用deferred,那么deferred到底是个什么东西,看个例子
var wait = function(){
  var task = function(){
    console.log('执行完成');
  }
  setTimeout(task, 2000);
}
wait();

现在在task里面的执行完成之后进行某些特别复杂的操作,代码可能会很多。那么要这么怎么办。如果继续在下面写也没有问题,但是不符合开放封闭的原则。后面很有可能多次再改这一大堆的代码。对修改开放,对拓展关闭。我们需要实现对修改关闭,对拓展开放。

为了解决这个问题,我们引入jquery的deferred
function waitHandle(){
  var dtd = $.Deferred(); // 创建一个deferred对象   var wait = function(dtd){ // 要求传入一个 deferred对象
    var task = function(){
      console.log('执行完成');
      dtd.resolve(); // 表示异步任务已经完成
      // dtd.reject(); // 表示异步任务失败或出错
    }
    setTimeout(task, 2000);
    return dtd; // 要求返回deferred对席那个
  }   // 注意,这里一定要有返回值
  return wait(dtd);
}

这里面有三层函数,第一层函数是waitHandle,第二层是wait函数,第三层是task函数。这里有两个return,第一个传进did。然后进行一系列加工,返回了dtd。然后最终怎么用

var w = waitHandle();
w.then(function(){
  console.log('success1');
},function(){
  console.log('error');
})
.then(function(){
  console.log('success2')
},function(){
  console.log('error2')
});
// 还有w.done 和 w.fail

总结,dtd的api可分成两类,用意不同

第一类:dtd.resolve dtd.reject
第二类:dtd.then dtd.done dtd.fail
这两类应该分开,否则后果很严重!
比如在上面代码最后执行dtd.reject()。试一下后果。。
function waitHandle(){
  var dtd = $.Deferred(); // 创建一个deferred对象   var wait = function(dtd){ // 要求传入一个 deferred对象
  var task = function(){
    console.log('执行完成');
    dtd.resolve(); // 表示异步任务已经完成
    // dtd.reject(); // 表示异步任务失败或出错
  }
  setTimeout(task, 2000);
    return dtd; // 要求返回deferred对席那个
  }   // 注意,这里一定要有返回值
  return wait(dtd);
} var w = waitHandle();
w.reject() // 非常不老实的做法
w.then(function(){
  console.log('success1');
},function(){
  console.log('error');
}).then(function(){
  console.log('success2')
},function(){
  console.log('error2')
});
那么怎么解决这个问题呢,也就引出了最最重要的角色,非常类似于promise;
function waitHandle(){
  var dtd = $.Deferred(); // 创建一个deferred对象   var wait = function(dtd){ // 要求传入一个 deferred对象
    var task = function(){
      console.log('执行完成');
      dtd.resolve(); // 表示异步任务已经完成
      // dtd.reject(); // 表示异步任务失败或出错
    }
    setTimeout(task, 2000);
    return dtd.promise(); // 这里返回promise,而不是直接返回deferred
  }   // 注意,这里一定要有返回值
  return wait(dtd);
} var w = waitHandle();
w.then(function(){
  console.log('success1');
},function(){
  console.log('error');
}).then(function(){
  console.log('success2')
},function(){
  console.log('error2')
});
虽然这里promise()方法的调用,但已经把promise最初的概念提出来了,这还是jquery1.5的时候。返回promise以后,这个时候去b同学去改w.reject()会报错。返回promise后,只能用监听的方法then,done,fail,不能去改resolve,reject。监听是其他同学唯一的权利。

jquery-deferred应用的更多相关文章

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

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

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

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

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

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

  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系统中提交 ...

  10. javascript --- jQuery --- Deferred对象

    javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应 ...

随机推荐

  1. 修改ecshop的70种技巧

    1.如何修改网站”欢迎惠临本店”答复(dafu):languages\zh_cn\common.php文件中,$_LANG['welcome']=’欢迎惠临本店’:将他修改成你需要的字样. 2.如何修 ...

  2. FastDFS配置详解之Storage配置

    1 基本配置disabled #func:该配置文件是否生效#valu:## true:无效## false:生效disabled=false group_name#func:本storage ser ...

  3. jvm(5)---垃圾回收(回收算法和垃圾收集器)

    1.垃圾回收算法 1.1 标记-清除算法 算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.它是最基础的收集算法,效率也很高,但是会带来两个明显的问题 ...

  4. git的使用学习(一)git的简介和安装

    Git简介 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git有什么特点?简单来说就是:高端大气上档次! 那什么是版本控制系统? 如果你用Microsoft Word写 ...

  5. MySQL语句增加字段,修改字段名,修改类型,修改默认值

    原文地址:https://blog.csdn.net/kimgoo/article/details/54630257 增加字段:alter table 表名 ADD 字段 类型 约束 [默认值 注释] ...

  6. 关于mathtype6.9在office2010中出现The MathType can not be found的问题

    本文问题解决方法参考:https://blog.csdn.net/yiran103/article/details/41694843 自从重装了系统,安装mathtype总是提示The MathTyp ...

  7. Vmware问题: 开机提示“虚拟机已被打开,是否获得所有权?”& Vmware检测不到USB

    "一只美丽的小鸟,在绿色的草坪上蹦来跳去,很是可爱"----清风徐来 问题1: Vmware开机提示"虚拟机已被打开,是否获得所有权?" 解决: 关闭虚拟机,用 ...

  8. [转帖]Epoll和IOCP的比较

    Epoll和IOCP的比较 https://yq.aliyun.com/articles/53621/   kryptosx 2016-05-27 23:32:51 浏览6181   原来整理过一个& ...

  9. 了解CAdoSqlserver

    include <vector> 表示引用了vector类, vector是STL中的一种数据结构,或者叫容器,功能相当于数组,但是功能强大很多.vector在C++标准模板库中的部分内容 ...

  10. Linux基础-05-正文处理、tar、解压缩

    1. 使用cat命令进行文件的纵向合并 1) 使用cat命令实现文件的纵向合并: a) 例如:使用cat命令将baby.age.baby.kg和baby.sex这三个文件纵向合并为baby文件的方法: ...