1. $.Callbacks()模块开发目的是:给内部的$.ajax()和$.Deferred()模块提供统一的基本功能组件。它可以用来作为类似基础定义的新组件的功能
2. “异步模式”一共有4种方法,这4中方法可以写出结构更合理,性能更出色,维护更方便的js代码。
①回调函数(callback):将一个函数A作为参数传递给另一个函数B,作为参数的这个A函数就是回调函数
②事件监听(Listener)
③观察者模式
④promise对象
3. $.Callbacks()还提供了once memory等参数用来处理
l once:确保这个回调函数只执行一次,
l memory:确保以前的值,将添加到这个列表的后面的最新的值,立即执行调用任何回调
l unique:确保一次只能添加一个回调(所以在列表list中没有重复的回调)
l stopOnFalse:当一个回调返回false时中断调用
jQuery回调模块结构
1. $.Callbacks()的API列表如下:
var callbacks = $.Callbacks();
l callbacks.add(); 回调列表中添加一个回调或回调的集合
例如:callbacks.add(function(){
alert("a");
})
l callbacks.remove(); 从回调列表中删除一个回调或回调集合
l callbacks .fire(); 用给定的参数调用所有的回调
l callbacks .fired(); 访问给定的上下文和参数列表中的所有回调
l callbacks.fireWith();访问给定的上下文和参数列表中的所有回调
l callbacks .empty(); 从列表中删除所有的回调
l callbacks.disable(); 禁用回调列表中的回调
l callbacks.disabled(); 确保回调列表是否已被禁用
l callbacks.has(); 确保列表中是否提供一个回调
l callbacks.lock(); 锁定当前状态的回调列表
l callbacks.locked(); 确保回调列表是否已被锁定
2. 通过学习观察者模式的思路,我们知道callback需要在内部维护一个list的队列数组,用于保存订阅的对象数据。同时也需要提供了add、fire、remove等订阅、发布、删除类似的接口。
那么我们如何把订阅的对象数据给list队列数组呢?
实现思路:构建一个存放回调的数组,如var list = [],通过闭包使这条回调数组保持存在。添加回调时,将回调push进list,执行则遍历list执行回调
①once的设计
Once的作用是确保回调列表只执行一次
源码如下:
function Callbacks(options){
var list = [];
var self;
self = {
add:function(fn){
list.push(fn)
},
fire:function(args){
if(list){
list.forEach(function(fn){
fn(args);
})
if(options === "once"){
list = undefined;
}
}
}
}
return self;
}
②memory的设计
1. memory:保持以前的值,将添加到这个列表的后面的最新的值立即执行调用任何回调
2. 回调函数是从异步队列Deferred分离出来的
3. memory主要用来实现deferred的异步收集与pipe管道风格的数据传输
③unique的设计
1. unique:确保一次只能添加一个回调,所以在列表中没有重复的回调
2. var callbacks = Callbacks( "unique" );
callbacks.add( fn1 );
callbacks.add( fn1 ); // 重复添加
callbacks.add( fn1 );
callbacks.fire( "foo" );
结果过滤了相同的add操作。
④stopOnFalse
1.stopOnFalse:当一个回调返回false时就中断调用