<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>deferred对象</title></head><body>两个对象,一个是promise对象,另一个是deferred对象。Deferred方法,返回deferred对象。Deferred里面有then方法,返回promise对象。jQuery源码1.对参数做处理。处理的目的是,对不合法的参数,返回错误。对不同的参数类型,参数位置,做多态处理。2.常用&&或者||或者三目判断。3.常用typeof做判断。4.假设全部以正确方式来运行的态度,看代码。5.剔除源代码没必要的遍历,以最小集合来阅读。</body><script src="../jquery-2.0.3.js"></script><script>/*dfd.then(fn1) 刚开始内部生成一个newDfd,先把fn1装饰一下变成fn1-1,再把fn1-1给dfd的函数队列。因为dfd内部的list是once memory了,所以fn1-1马上执行,内容如下:fn1返回fn1-promise,然后把newDfd的resolve函数给fn1-promise。dfd.then(fn1)最后返回一个newDfd的newPromise因为fn1-deferred已经resolve过了,所以又执行newDfd.resolve,接下来是下一个then了。*///  看代码,弄清空间和空间之间的运动关系,逻辑也就清晰了。 //  分主次,首先把分枝减掉,留下主干,把主干搞清楚。function Deferred( func ) {var list = jQuery.Callbacks("once memory");var promise = {then: function() {var fns = arguments;var newDfd = Deferred(function( newDefer ) {var fn = jQuery.isFunction( fns[ 0 ] ) && fns[ 0 ];deferred[ "done" ](function() {var returned = fn && fn.apply( this, arguments );returned.promise().done( newDefer.resolve )});fns = null;});var newPromise = newDfd.promise();return newPromise;},promise: function( obj ) {return obj != null ? jQuery.extend( obj, promise ) : promise;},done: list.add},deferred = {resolve: function() {deferred[ "resolveWith" ]( this === deferred ? promise : this, arguments );return this;},resolveWith: list.fireWith,flag:"newDfd"};promise.promise( deferred );if ( func ) {func.call( deferred, deferred );}return deferred;}var dfd = Deferred();dfd.flag = "dfdflag";dfd.then(function(){var dfd1 = Deferred();dfd1.flag = "dfd1flag";alert(1);dfd1.resolve();return dfd1.promise();}).then(function(){var dfd2 = Deferred();alert(2);dfd2.resolve();return dfd2.promise();}).then(function(){var dfd3 = Deferred();alert(3);dfd2.resolve();return dfd2.promise();});dfd.resolve();</script></html>

其实jQuery的Deferred还是有bug的。

设想如下代码:

function(){var dfd = $.Deferred();dfd.resolve();$.ajax()return dfd.promise();
}

就算你提前resolve,ajax还是会执行。

jQuery的Deferred相关推荐

  1. jQuery的deferred对象详解

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

  2. 谈谈JQuery的Deferred对象

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

  3. 利用jQuery的deferred异步按顺序加载JS文件

    前段时间看了阮一峰的jQuery的deferred对象详解一文,对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码), ...

  4. jQuery使用Deferred对象执行异步操作

    在JQuery 1.5之前,Ajax仅支持一个回调函数,但在JQuery的1.5版本中,引入了 Deferred对象,它和ES6的Promise对象长的有点像,jQuery的Deferred对象也有r ...

  5. jQuery的deferred延时对象

    1.作用 deferred对象是一个延迟对象,意思是函数延迟到某个点才开始执行,改变执行状态的方法有两个(成功:resolve和失败:reject),分别对应两种执行回调(成功回调函数:done和失败 ...

  6. jQuery中deferred对象的使用(二)

    接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调. deferred对象的使用(二) deferred对象不光可 ...

  7. Appcan开发笔记:结合JQuery的$.Deferred()完善批量异步发送

    appcan的 uexXmlHttpMgr.send 或者 appcan.ajax无法同步请求(没有找到这个属性),只能异步,造成循环多次提交时由于延迟或网络堵塞等原因无法同步响应,导致提交顺序混乱, ...

  8. jQuery的deferred对象深析

    从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuer ...

  9. jquery 之 Deferred 使用

    Deferred是jquery的promise接口的实现.他是非同步操作的通用接口,可以看作是完成一个任务之后再执行另外一个任务. 观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和 ...

最新文章

  1. Transformer应用到建筑行业,CAD设计起飞了
  2. mysql 军规_MySQL军规
  3. java8常用stream
  4. Virtual Machine Manager 2008 2008 R2系列之安装部署
  5. Java实现插入排序及其优化 insertion sort
  6. hibernate mysql写入中文乱码
  7. 四-1、Cadence Allegro推荐操作方式和视图命令
  8. greenplum 查询出来的数字加减日期_Python实践代码总结第5集(日期相关处理)
  9. dreamcast游戏_《Dreamcast Collection》开箱及游戏介绍
  10. (原創) 網站CSS重新調整,全面支援IE6與FireFox 2.0!! (Web) (CSS)
  11. pyside qt for python 在ubuntu下构建依赖
  12. 夏普Sharp MX-M2658N 一体机驱动
  13. steam服务器102修复,steam社区打不开错误代码102解决方法
  14. LAB,RGB,CMYK区别
  15. 计算机隐藏用法表白,微信隐藏符号功能大全 情人节可以发这些表白
  16. [蓝桥杯]第39级台阶(Python实现)
  17. Windows窗口编程之计算机,WindowsAPI窗口程序设计.docx
  18. C#爬虫爬取京东自营笔记本
  19. Python pypinyin库,实现文字转拼音
  20. 十大跑步运动耳机品牌有哪些,质量比较好的运动耳机品牌推荐

热门文章

  1. webtop搭建简单知识库粗略介绍
  2. Windows 下 PHP 开发环境配置系列二(使用 MODx CMS)
  3. 安装iis 出现ASP无法访问的解决方法
  4. ORA-01033 的解决
  5. c语言赌徒游戏,The Gambler(I)赌徒(英文版)
  6. linux查看消息队列的状态,linux – 如何知道某个时间点在消息队列中收到的消息数...
  7. 无连接可靠传输_计算机网络-网络层和传输层
  8. opencv 直方图_OpenCV-Python 直方图-3:二维直方图 | 二十八
  9. 计算机三级之嵌入式系统学习笔记7
  10. 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...