jquery1.7.2的源码分析(三)$.Deferred
例子的详细讲解
Filter Resolve
上面的的代码是怎么运行的呢
点击button的先执行 $.Deferred(),得到具有很多方法的defer
defer.resolve( 5 );
var doneList = jQuery.Callbacks( "once memory" ),
failList = jQuery.Callbacks( "once memory" ),
progressList = jQuery.Callbacks( "memory" ),
state = "pending";
lists = {
resolve: doneList,
reject: failList,
notify: progressList
}
for ( key in lists ) {
deferred[ key ] = lists[ key ].fire;
deferred[ key + "With" ] = lists[ key ].fireWith;
}
//根据上面的代码可得
//deferred[ 'resolve']=lists[ 'resolve'].fire;
//deferred[ 'resolveWidth']=lists[ 'resolve'].fireWith;
//deferred[ 'reject']=lists[ 'reject'].fire;
//deferred[ 'rejectWidth']=lists[ 'reject'].fireWith;
//deferred[ 'notify']=lists[ 'notify'].fire;
//deferred[ 'notifyWidth']=lists[ 'notify'].fireWith;
//因此resolve( 5 )执行了
fire: function() {
    self.fireWith( this, arguments );
    return this;
},
fireWith: function( context, args ) {
//stack=[];为true;firing 为false;flag={}
    if ( stack ) {
        if ( firing ) {
            if ( !flags.once ) {
                stack.push( [ context, args ] );
            }
//memory =undefined
        } else if ( !( flags.once && memory ) ) {
            fire( context, args );
        }
    }
    return this;
}
fire = function( context, args ) {
        args = args || [];
//memory = [ context, args ];即为self,和5
        memory = !flags.memory || [ context, args ];
        fired = true;
        firing = true;
        firingIndex = firingStart || 0;
        firingStart = 0;
        firingLength = list.length;
        for ( ; list && firingIndex < firingLength; firingIndex++ ) {
//函数执行后为false并且flags.stopOnFalse 为true时memory = true;
//注意这里执行了函数
            if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
                memory = true; // Mark as halted
                break;
            }
        }
        firing = false;
        if ( list ) {
            if ( !flags.once ) {
                if ( stack && stack.length ) {
                    memory = stack.shift();
                    self.fireWith( memory[ 0 ], memory[ 1 ] );
                }
            } else if ( memory === true ) {
                self.disable();
            } else {
//最终又把list函数组给赋值为空
                list = [];
            }
        }
    }
												
											jquery1.7.2的源码分析(三)$.Deferred的更多相关文章
- jquery1.7.2的源码分析(一)
		说到jquery可能是大家最经常用到的,在日常的编写程序中最经常使用到,在使用jquery插件的同时,深入的解读jquery源码有利于我们学到设计的思想和实现的技巧 在jquery源码的分析中,其中艾 ... 
- cocos2dx骨骼动画Armature源码分析(三)
		代码目录结构 cocos2dx里骨骼动画代码在cocos -> editor-support -> cocostudio文件夹中,win下通过筛选器,文件结构如下.(mac下没有分,是整个 ... 
- spark[源码]-任务调度源码分析[三]
		前言 在上一篇文章中,我主要是讲解了DAG阶段的处理,spark是如何将一个job根据宽窄依赖划分出多个stage的,在最后一步中是将生成的TaskSet提交给了TaskSchedulerInmpl的 ... 
- HashMap源码分析三
		HashMap的源码,在jdk1.5中相比jdk1.4,改动不大,有几个方面 1 jdk1.5中引入了范型,在HashMap中也有体现 2 引入了另一个hash值的计算方式,不过默认是关闭状态 ... 
- Qt update刷新之源码分析(三)
		大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt刷新事件(QEvent::UpdateRequest)的处理流程,这次视频主要从源码层面剖析对刷新事件的进一步处理, ... 
- YII 的源码分析(三)
		前面已经看完了启动一个yii程序所要经过的流程,以及渲染一个页面是怎么完成的.今天要分析的是yii是如何处理用户请求的.也就是控制和动作部分. 还是以helloworld为例演示这一过程.我们在地址栏 ... 
- Nop源码分析三
		程序的初始化工作和Ioc工作已经做完,nop默认引擎已经初始化. 下面在回到global文件的启动方法Application_Start()中, 1,继续分析下面的代码: var dependency ... 
- java动态代理——字段和方法字节码的基础结构及Proxy源码分析三
		前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ... 
- jquery1.7.2的源码分析(四)$.Deferred(2)
		jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // ... 
随机推荐
- java编码原理,java编码和解码问题
			java的编码方式原理 java的JVM的缺省编码方式由系统的“本地语言环境”设置确定,和操作系统的类型无关 . 在JAVA源文件-->JAVAC-->Class-->Java--& ... 
- A new comer playing with Raspberry Pi 3B
			there are some things to do for raspberry pi 3b for the first time: 1, connect pi with monitor/KB/mo ... 
- 使用Nexus搭建Maven本地仓库
			阅读目录 序 Nexus 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 在工作中可能存在有 ... 
- ORACLE lag()与lead() 函数
			一.简介 lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤.这种 ... 
- Servlet入门笔记
			一.一个简单的Servlet 在servlet 3.0之前,下面是基本步骤: 1.新建一个class名为FirstServlet,让它继承javax.servlet.http.HttpServlet: ... 
- OpenStack 企业私有云的若干需求(4):混合云支持 (Hybrid Cloud Support)
			本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ... 
- 初识SpringMvc
			初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ... 
- UVA10304
			全部遍历.设置两个下标,若相同i++,j++,不相同则j++. #include<stdio.h> #include<string.h> int main(){ ]; ]; s ... 
- [LeetCode] Restore IP Addresses  复原IP地址
			Given a string containing only digits, restore it by returning all possible valid IP address combina ... 
- LISA介绍及其使用方法
			LISA是ARM公司开发的一款开源工具.在内核开发过程中,苦于无法针对修改内容进行一些量化或者可视化结果的测量,而无感.LISA对于模型调优,回归测试都有较强的支持. 什么是LISA? LISA是Li ... 
