list哪来的啊

来源:5-4 $.Deferred的设计

Brood180

2015-05-25 15:08

 46行,deferred[tuple[0] + "With"] = list.fireWith;

上面的list是从哪里来的啊,貌似没有定义啊


写回答 关注

2回答

  • 艾伦Aaron
    2015-05-26 15:10:32

    慕课上由于课程的关系,有些地方可能需要看源码,没有很细的深入:


    摘自我正在写的书(jQuery框架设计与实现)部分解释:

        jQuery在代码上的设计,最喜欢的就是合并很多相似功能的代码,达到省代码量的目的。deferred对象中有很多的方法,但是实际上在定义的部分jQuery并没有一个一个指定接口与对应方法。Deferred方法中定义了一个数据元组集, 每个元组分别包含一些与当前deferred相关的信息。

         deferred相关的数据元组集:这是一个很有抽象的合并设计,promise规范指明了内部会有三个状态成功、失败、进行中,通过指定的方法来修改这些状态,那么我们在合并的时候可以把同类状态与方法都写到一个数组中,就出现了这样的一种合并设计了。

    var tuples = [
             ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],
             ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],
             ["notify", "progress", jQuery.Callbacks("memory")]
    ]

    每一组数组集,代表的意思:

    1.触发回调函数列表执行(函数名),
    2.添加回调函数(函数名)
    3.回调函数列表(jQuery.Callbacks对象)
    4.deferred最终状态(第三组数据除外)

    如何使用?我们通过循环取出每个数组中的定义,然后赋给不同的对象去操作,这里定义2个对象 一个promise,一个deferred。

    var promise = {},deferred = {};
    for (var i = 0; i < tuples.length; i++) {
             var triggerName  = tuples[i][0] //触发器方法 resolve、reject、notify
             var callbackName = tuples[i][1] //监听的回调 done、fail、progress
             var operate      = tuples[i][2] //具体操作的方法 callback对象
             var statusName   = tuples[i][3] //状态值 resolved、rejected
     
             //给promise上附加done、fail、progress,
             //对应的回调用callback.add保存
             promise[ callbackName ] = operate.add;
     
             //触发方法
             // resolve、reject、reject
             deferred[ triggerName ] = function() {
                       deferred[ triggerName+ "With" ]( this === deferred ? promise : this, arguments );
                       return this;
             };
             //resolveWith、rejectWith、rejectWith
             deferred[triggerName + "With" ] = operate.fireWith;
    }

    循环数据元组集,然后把接口与方法都混入到了对应的deferred与promise对象上了

            promise与deferred对象上对应的方法就是jQuery针对Promise规范的一种扩展,但是核心来说都是基于回调模式,jQuery就抽出了一个jQuery.Callbacks是模块专门来处理这种回调逻辑。done|faile|progress 就是Callbacks.add方法增加一个监听函数, resolve、reject、notify就是触发对应的回调,通过Callbacks. fireWith来处理。


    http://img.mukewang.com/55641c570001480606340262.jpg

  • 不断滴自我催眠
    2015-05-26 10:29:00

    它没写全吧···我去看的源码 jquert-2.0.0.js 里是这样写的 #前面还有一些代码,有定义设置list#

    // Add list-specific methods
    		jQuery.each( tuples, function( i, tuple ) {
    			var list = tuple[ 2 ],
    				stateString = tuple[ 3 ];
    
    			// promise[ done | fail | progress ] = list.add
    			promise[ tuple[1] ] = list.add;
    
    			// Handle state
    			if ( stateString ) {
    				list.add(function() {
    					// state = [ resolved | rejected ]
    					state = stateString;
    
    				// [ reject_list | resolve_list ].disable; progress_list.lock
    				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
    			}
    
    			// deferred[ resolve | reject | notify ]
    			deferred[ tuple[0] ] = function() {
    				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
    				return this;
    			};
    			deferred[ tuple[0] + "With" ] = list.fireWith;
    		});


jQuery源码解析(架构与依赖模块)

由浅入深地剖析jQuery库的设计与实现,揭开框架背后的秘密

84047 学习 · 280 问题

查看课程

相似问题