首先,Deferred是Promise的一种实现,并且,Deferred对象可以通过Callbacks实现,两者的使用方式也很像。

由于Promise有两种完成状态,一种resolve,一种reject,所以,对应的Callbacks就有两个,还有一个notify,似乎不是标准的Promise状态?

  • Deferred用到了Callbacks里面的memory参数,是因为Promise达到完成态后,再调用then方法时,应该按照之前的完成状态来进行触发
  • Deferred用到了Callbacks里面的once参数,是因为Promise达到完成态后,状态就不应该再改变了

有个问题是Deferred的状态是可以在外部改变的,调用$.Deferred()产生的对象cb上有cb.resolve()和cb.reject()方法(new Promise()创建的对象上没有),所以在Deferred中引入了promise()方法,目的就是使外部不能改变cb的状态,看这部分代码的时候被promise.then()函数和promise.promise( deferred );这句给误导了,其实具体的实现不在promise.then()里,而是在promise()方法里(回过头来看简直理所当然)。

promise()函数,如果不传参数,那么就返回promise对象,而promise对象里是没有deferred对象上的resolve、reject这些方法的

promise: function( obj ) {return obj != null ? jQuery.extend( obj, promise ) : promise;
}

##Deferred函数里面有:

  1. 一个deferred对象,是返回的值,上面有resolve、reject、notify这些方法,自己没实现,是使用了Callbacks的实现
  2. 一个promise对象,上面有then、always、promise等方法,promise函数代码很少,但是它才是实现外部不能改变Deferred对象状态的关键,then函数的作用是done()和fail()可以一起写,就像ES6的Promise的then一样,always函数的作用是不论resolve还是reject,它指定的回调函数总是执行

$.when()是实现了ES6的Promise.all(),基本原理就是通过一个remain变量来存储还有多少的deferred没有执行的

================
2018-06-20

deferrred的then函数的作用是绑定resolve和reject后的回调,之前看的时候不注意,以为也就是一些和callbacks关联起来的操作而已,经过这篇文章(http://www.cnblogs.com/aaronjs/p/3356505.html)的提醒,发现then里面返回的是一个新的deferred,不过这篇文章里也没有解答为什么需要返回一个新的deferred(或许是我看的不仔细?),目前我也还没看懂,Deferred的函数体里还有一句和then相关的

if ( func ) {func.call( deferred, deferred );
}

看一下这篇也许能看懂https://www.cnblogs.com/yangjunhua/p/3509342.html,个人感觉也并不是逻辑有多深奥,而是有很多技巧和使用场景相关的内容,太纠结也不是很有必要

4.Deferred相关推荐

  1. jQuery的deferred对象详解

    阮一峰大神的关于jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  2. angularJs 之deferred

    angularJs 对promise的封装 var deferred = $q.defer();deferred.promise.then(function(){var result = {}cgiS ...

  3. ajax dojo deferred,dojo(四):ajax请求

    储备知识 1.在介绍新版本的ajax请求之前,需要先了解一些dojo/Deferreds. 初次听到"Deferred"这个概念,可能会觉得这是一个神秘的东西.实际上它在执行异步操 ...

  4. 谈谈JQuery的Deferred对象

    最近一个变态的项目,一个页面只含编辑器且有下载功能,大概含20个左右接口,要求数据完整显示(很多echarts图),弄个等待圈圈等它loading,启用jQuery的Deferred延迟对象,再多的接 ...

  5. jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)

    Deferred的概念请看第一篇 http://www.cnblogs.com/aaronjs/p/3348569.html ******************构建Deferred对象时候的流程图* ...

  6. 在场景中添加光线——在Deferred Shading引擎中添加阴影能力

    问题 虽然你已经掌握了基本的计算机实时光照,但你应该注意到光源还没有投射出阴影.这是因为pixel shader是基于光线与法线的夹角计算光照的.直到现在,pixel shader还没有考虑到光线与像 ...

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

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

  8. twisted Unhandled error in Deferred scrapy

    twisted Unhandled error in Deferred scrapy 结果报错Unhandled error in Deferred scrapy,百度了很久得到解决方案: 网上解决方 ...

  9. Node初学(二)Promise/Deferred模式,异步调用

    Promise/Deferred模式最早出现在jQuery1.5版本,在该版本几乎重写了Ajax部分,使得Ajax成链式表达式. $.get('/api') .success(onSuccess) . ...

  10. [20180306]关于DEFERRED ROLLBACK2.txt

    [20180306]关于DEFERRED ROLLBACK2.txt --//上午测试DEFERRED ROLLBACK针对表空间offline才有效,我测试回滚一定会写到DEFERRED ROLLB ...

最新文章

  1. C语言——日常刷题(一)
  2. linux通过platform_match()匹配platform总线上的device和driver
  3. VBoxManage命令详解
  4. CG CTF WEB Download~!
  5. HDU 2546(01背包)
  6. c++二维数组指针详解
  7. Mars——基于矩阵的统一分布式计算框架
  8. 软件测试基础课程学习笔记7---如何撰写测试报告
  9. list 分组求和_数据分析-python-分组聚合-2
  10. menu什么意思中文意思_telegraph什么意思
  11. 思科交换机配置试题_思科交换机基本配置命令全集
  12. C语言经典案例——第六章 字符串
  13. 智慧社区管理系统06(业主列表和功能实现)
  14. DDL、DML和DCL的理解(1、总述)
  15. android图片涂鸦(标记)
  16. Python爬虫进阶必备 | 极X助手加密算法分析
  17. r语言把多个图合并在一张图_SAS 绘制亚组分析森林图
  18. 热爱生活,更热爱代码
  19. linux c++读取excel文件的库
  20. 线控改装技术连载一之——线控开端和车辆组成

热门文章

  1. findfirst, findnext
  2. Spark-SparkSession.Builder 源码解析
  3. 【ubuntu查看显卡、配置显卡、cuda、cudnn】
  4. 笔记:Solow 模型整理
  5. java播放器使用教程_[Java教程]Java音乐播放器
  6. SLAM导航机器人零基础实战系列:(五)树莓派3开发环境搭建——2.安装ros-kinetic
  7. 昨晚罗老师的手机发布了,传闻发布会的门票就卖了
  8. TextView与EditText
  9. 简明扼要的概述微服务设计原则,深入开发微服务,就从今天开始
  10. linux分区表mbr改gtp,免重装系统 手把手教你MBR转GPT分区表