读书人

jQuery 2.0.3 源码分析 Deferred(最细

发布时间: 2013-10-22 16:17:14 作者: rapoo

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

?

******************构—eferred对象时候的流程图**************************

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

?

**********************源码解析**********************

?

因为callback被剥离出去后,整个deferred就显得非常的精简

jQuery 2.0.3 源码分析 Deferred(最细的实现辨析,带图)
jQuery.extend({     Deferred : function(){}        when : function())}
jQuery 2.0.3 源码分析 Deferred(最细的实现辨析,带图)

对于extend的继承这个东东,在之前就提及过jquery如何处理内部jquery与init相互引用this的问题

对于JQ的整体架构一定要弄懂?http://www.cnblogs.com/aaronjs/p/3278578.html

所以当jQuery.extend只有一个参数的时候,其实就是对jQuery静态方法的一个扩展

?

我们在具体看看2个静态方法内部都干了些什么:

Deferred整体结构:

源码精简了部分代码

jQuery 2.0.3 源码分析 Deferred(最细的实现辨析,带图)
Deferred: function( func ) {        var tuples = [                // action, add listener, listener list, final state                [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],                [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],                [ "notify", "progress", jQuery.Callbacks("memory") ]            ],            state = "pending",            promise = {                state: function() {},                always: function() {},                then: function( /* fnDone, fnFail, fnProgress */ ) { },                // Get a promise for this deferred                // If obj is provided, the promise aspect is added to the object                promise: function( obj ) {}            },            deferred = {};        jQuery.each( tuples, function( i, tuple ) {            deferred[ tuple[0] + "With" ] = list.fireWith;        });        promise.promise( deferred );        // All done!        return deferred;    },
jQuery 2.0.3 源码分析 Deferred(最细的实现辨析,带图)
  1. 显而易见Deferred是个工厂类,返回的是内部构建的deferred对象
  2. tuples 创建三个$.Callbacks对象,分别表示成功,失败,处理中三种状态
  3. 创建了一个promise对象,具有state、always、then、primise方法
  4. 扩展primise对象生成最终的Deferred对象,返回该对象

这里其实就是3个处理,但是有个优化代码的地方,就是把共性的代码给抽象出来,通过动态生成了

?


具体源码分析:

Deferred自身则围绕这三个对象进行更高层次的抽象

读书人网 >互联网

热点推荐