我们在日常开发中很少会用到Callbacks,但是我为什么会这么急着介绍Callbacks呢,因为接下我想说一下promise,这两部分有密切的联系至于什么联系到介绍promise时我们会明白的。
Callbacks它是一个多用途的回调函数列表对象,提供了一种强大的方法来管理回调函数队列。如下例子
function fn1(){
alert(111)
}
function fn2(){
alert(222)
}
var callBack = $.Callbacks();
callBack.add(fn1);
callback.add(fn2);
callback.fire();
alert(111)
}
function fn2(){
alert(222)
}
var callBack = $.Callbacks();
callBack.add(fn1);
callback.add(fn2);
callback.fire();
Callbacks它有四个可能的参数:once、memory、unique、stopOnFalse。当然也可以用数组的形式把四个都传入。once是不论几次调用fire队列里的函数只调用一次,memory是在fire之后再用add添加函数函数也会执行的,unique一个函数添加几次fire里只执行一次,stopOnFase函数retufn false里会中断执行。
我们来看源码
这个工具方法里最重要的两个函数就是add和fire而fire是调用一名子是fire的私有方法实现的,所以我们只看add和fire
- 通过判断参数是函数还是数组把传进来的参数在没有unique参数或都函数不在list数组中时放进list数组
- 这里memory参数为ture里会自动调用私有fire方法,什么时候memory会为true呢?在私有fire方法的第一句可以看到memory = options.memory && data;这就实现了加memory参数时为什么会有记忆功能了,jquery的设计是不是很巧妙呢。
接下来我们看一下私有fire方法
- fire就是遍历list数组执行list里的函数顺便再把参数传递到要执行的函数里
- stack存的是fireing期间再次fire的参数这里再重新执行一下如下代码
写道
var callBack = $.Callbacks();
function fn1(){
alert(111)
callback.fire()
}
function fn2(){
alert(222)
}
callBack.add(fn1);
callback.add(fn2);
callback.fire();
function fn1(){
alert(111)
callback.fire()
}
function fn2(){
alert(222)
}
callBack.add(fn1);
callback.add(fn2);
callback.fire();
到这里我们是不是已经看出这个是什么模式,是不是观察者模式啊。