jQuery源码分析之Callbacks详解

2020-05-23 06:21:26易采站长站整理

当然,我们要的,不仅仅是这样一个简单的工具对象——在jQuery源码中,Callbacks提供了一组函数的基本管理,为Deferred(异步队列)提供了基础,同时也服务于Queue(同步队列)。 Deferred用于抹平/扁平化金字塔编程(大量的回调函数嵌套,例如Ajax中需要根据请求返回码决定执行的代码); 而Queue,驱动着jQuery.animate(动画引擎)。

那么我们就来编写一个Callbacks吧。

Callbacks模型

Array(数组):
既然我们Callbacks要承接一系列函数,那么必然需要有一个容器。我们可以使用一个数组,并把每一个函数压到该数组中,需要执行的时候,循环数组项执行。

工作模型:

这个Callbacks需要非常的强大,并不仅仅是压入函数,然后执行这么简单,这个Callbacks应该拥有良好的执行模型。
once:当前Callbacks对象中所有的函数只会执行一次,执行一次完之后就会被释放掉,我们可以为使用Callbacks对象的用户提供一个稳定有效的方案,确保函数只会执行一次,之后不再执行,稳定了这些函数的线程。
auto:自动执行模型,这是个有意思的模型,有些函数依赖上一层函数,例如函数b的执行依赖于函数a,那么我们提供一个自动执行的模型:第一次执行这个Callbacks之后,每次添加函数到Callbacks的时候,自动执行过去添加的那些函数,并把最后一次给定的参数数据传递给过去的那些函数,这样就从Callbacks中抹平了这些依赖函数之间需要反复触发的关系,这是个有意思的模型。
once&auto:我们可以让它更强大,同时工作once和auto模型,即:当每次添加函数到Callbacks中的时候,过去的函数都会执行,然后,释放掉这些过去的函数,下次继续添加函数的时候,过去的那些函数不会再执行,因为once模型,已经把它们释放掉了。

API:

add(function) – 添加一个(或多个)函数到Callbacks对象中:当然,如果你并不添加函数只是好奇看看Callbacks,我们也将让你继续享受你的乐趣——我们并不会抛出异常,因为这对于我们来说并不擅长。
remove(function) – 移除一个Callbacks中的一个函数:既然有了添加,那么我们也应该提供反悔的方案,我们是多么的平易近人,容忍着别人过去所做的一切。
has(function) – 判断Callbacks中是否包含一个函数:哦?你竟然不确定是否包含这个函数,当初可是你丢进来的啊!你怎么如此马虎?不过既然你问我的话,我仍然会告诉你Callbacks是否包含这个函数,我知道你很繁忙,并不能记住和确定所有的事情。
empty() – 清空Callbacks:这些函数对于你失去了意义了么?什么?已经执行过你就不想要了?所以你希望可以清空它?好吧,为了内存君我还是忍下你这个需求。