jQuery的Deferred
<!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相关推荐
- jQuery的deferred对象详解
阮一峰大神的关于jQuery的deferred对象详解 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...
- 谈谈JQuery的Deferred对象
最近一个变态的项目,一个页面只含编辑器且有下载功能,大概含20个左右接口,要求数据完整显示(很多echarts图),弄个等待圈圈等它loading,启用jQuery的Deferred延迟对象,再多的接 ...
- 利用jQuery的deferred异步按顺序加载JS文件
前段时间看了阮一峰的jQuery的deferred对象详解一文,对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码), ...
- jQuery使用Deferred对象执行异步操作
在JQuery 1.5之前,Ajax仅支持一个回调函数,但在JQuery的1.5版本中,引入了 Deferred对象,它和ES6的Promise对象长的有点像,jQuery的Deferred对象也有r ...
- jQuery的deferred延时对象
1.作用 deferred对象是一个延迟对象,意思是函数延迟到某个点才开始执行,改变执行状态的方法有两个(成功:resolve和失败:reject),分别对应两种执行回调(成功回调函数:done和失败 ...
- jQuery中deferred对象的使用(二)
接上一回的内容,漏了一个always()方法,参数也是回调函数,与done和fail不同的是,无论任何情况都执行always方法中的回调. deferred对象的使用(二) deferred对象不光可 ...
- Appcan开发笔记:结合JQuery的$.Deferred()完善批量异步发送
appcan的 uexXmlHttpMgr.send 或者 appcan.ajax无法同步请求(没有找到这个属性),只能异步,造成循环多次提交时由于延迟或网络堵塞等原因无法同步响应,导致提交顺序混乱, ...
- jQuery的deferred对象深析
从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuer ...
- jquery 之 Deferred 使用
Deferred是jquery的promise接口的实现.他是非同步操作的通用接口,可以看作是完成一个任务之后再执行另外一个任务. 观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和 ...
最新文章
- Transformer应用到建筑行业,CAD设计起飞了
- mysql 军规_MySQL军规
- java8常用stream
- Virtual Machine Manager 2008 2008 R2系列之安装部署
- Java实现插入排序及其优化 insertion sort
- hibernate mysql写入中文乱码
- 四-1、Cadence Allegro推荐操作方式和视图命令
- greenplum 查询出来的数字加减日期_Python实践代码总结第5集(日期相关处理)
- dreamcast游戏_《Dreamcast Collection》开箱及游戏介绍
- (原創) 網站CSS重新調整,全面支援IE6與FireFox 2.0!! (Web) (CSS)
- pyside qt for python 在ubuntu下构建依赖
- 夏普Sharp MX-M2658N 一体机驱动
- steam服务器102修复,steam社区打不开错误代码102解决方法
- LAB,RGB,CMYK区别
- 计算机隐藏用法表白,微信隐藏符号功能大全 情人节可以发这些表白
- [蓝桥杯]第39级台阶(Python实现)
- Windows窗口编程之计算机,WindowsAPI窗口程序设计.docx
- C#爬虫爬取京东自营笔记本
- Python pypinyin库,实现文字转拼音
- 十大跑步运动耳机品牌有哪些,质量比较好的运动耳机品牌推荐
热门文章
- webtop搭建简单知识库粗略介绍
- Windows 下 PHP 开发环境配置系列二(使用 MODx CMS)
- 安装iis 出现ASP无法访问的解决方法
- ORA-01033 的解决
- c语言赌徒游戏,The Gambler(I)赌徒(英文版)
- linux查看消息队列的状态,linux – 如何知道某个时间点在消息队列中收到的消息数...
- 无连接可靠传输_计算机网络-网络层和传输层
- opencv 直方图_OpenCV-Python 直方图-3:二维直方图 | 二十八
- 计算机三级之嵌入式系统学习笔记7
- 黑苹果hidp显示不清楚_魔兽世界9.0:盟约指挥台不显示胜率?搞清楚机制,轻松收菜!...