jQuery Deferred对象源码分析

1月 9, 2018 |

$.Deferred() 是一个工厂方法,返回的是一个添加了实现各种操作的Object对象。 内部是通过deferred = {};然后添加各种方法实现的,不是通过constructor实现的。在Deferred的实现中使用了jQuery.Callbacks 对象, 在jQuery.Callbacks中实现了将一个回调函数添加到队列以及触发队列中的回调函数的方法, 具体可以参考jQuery.Callbacks闭包中的jQuery.Callbacks.self.add和jQuery.Callbacks.self.fire方法
Deferred实现中有如下的代码
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
直接将jQuery.Callbacks.self.fireWith方法赋值给deferred[ "resolveWith" ]或者deferred[ "notifyWith" ]或者deferred[ "rejectWith" ],充分体现了js中函数对象的灵活性
触发回调
deferred.resolve() ->
jQuery.Callbacks.self.fireWith ->
jQuery.Callbacks.fire [非成员方法,而是jQuery.Callbacks闭包内的方法]
从队列中取回调函数并执行
list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] )
本文基于jquery-3.2.1.js, 各个版本的实现可能有差异, 本文由javacoder.cn整理,转载请注明出处
阅读代码时一定要耐心,多分析jQuery.Callbacks.self对象和jQuery.Deferred的交互过程

Posted in: WEB开发

Comments are closed.