memory:保持以前的值,将添加到这个列表的后面的最新的值立即执行调用任何回调 (像一个递延 Deferred)。

回调函数是从异步队列Deferred分离出来的,所以很多的接口设计都是为了契合Deferred接口,memory用的很多,这个缓存的设计这里提及一下

主要是用来实现deferred的异步收集与pipe管道风格的数据传递的,具体在Deferred有详解,这里大概了解下作用范围。

memory这个有点不好理解,我们还是通过列子说明下,看下面的代码:

function fn1(val) {
console.log('fn1 says:' + val);
} function fn2(val) {
console.log('fn2 says ' + val);
}
function fn3(val){
console.log("fn3 says " + val);
} /* var cbs = $.Callbacks("memory");
cbs.add(fn1);
cbs.fire('foo');
console.log('..........');
cbs.add(fn2);
cbs.fire('bar');
console.log('..........');
cbs.add(fn3);
cbs.fire('aaron');*/
function callbacks(options){
var list = [];
var self;
var memory;
var firingStart;
function _fire(data){
memory = options === 'memory' && data;//===>&&>=
firingIndex = firingStart || 0;
firingStart = 0;//改变firingStart,之后的fire还是从0开始。
firingLength = list.length;
for(; list && firingIndex < firingLength; firingIndex++){
list[firingIndex](data);
}
};
self = {
add: function(fn){
var start = list.length;
list.push(fn);
if(memory){
firingStart = start;//改变firingStart
_fire(memory);
}
},
fire: function(args){
if(list){
_fire(args);
if(options === "once"){
list = undefined;
}
}
}
};
return self;
}
var cc = callbacks("memory");
cc.add(fn1);
cc.fire("111");
console.log("...............");
cc.add(fn2);
cc.fire("222");

unique:

function fn1(val) {
console.log('fn1 says:' + val);
}
function fn2(val) {
console.log('fn2 says ' + val);
}
function fn3(val){
console.log("fn3 says " + val);
} /*var cbs = $.Callbacks("unique");
cbs.add(fn1);
cbs.add(fn1);
cbs.add(fn1);
cbs.fire('foo');
console.log('..........');*/ /*cbs.add(fn2);
cbs.fire('bar');
console.log('..........');
cbs.add(fn3);
cbs.fire('aaron');*/
function callbacks(options){
var list = [];
var self;
var memory;
var firingStart;
function _fire(data){
memory = options === 'memory' && data;//===>&&>=
firingIndex = firingStart || 0;
firingStart = 0;//改变firingStart,之后的fire还是从0开始。
firingLength = list.length;
for(; list && firingIndex < firingLength; firingIndex++){
list[firingIndex](data);
}
};
self = {
add: function(fn){
var start = list.length;
if(options === "unique"){
if(list.indexOf(fn) === -1){
list.push(fn);
}
}else{
list.push(fn);
} if(memory){
firingStart = start;//改变firingStart
_fire(memory);
}
},
fire: function(args){
if(list){
_fire(args);
if(options === "once"){
list = undefined;
}
}
}
};
return self;
}
var cc = callbacks("unique");
cc.add(fn1);
cc.add(fn1);
cc.add(fn1);
cc.fire("111");

stopOnfalse:

function fn1(val) {
console.log('fn1 says:' + val);
return false;
}
function fn2(val) {
console.log('fn2 says ' + val);
return false;
}
function fn3(val){
console.log("fn3 says " + val);
} /*var cbs = $.Callbacks("stopOnFalse");
cbs.add(fn1);
cbs.fire('foo');
console.log('..........');
cbs.add(fn2);
cbs.fire('bar');
console.log('..........');
cbs.add(fn3);
cbs.fire('aaron');*/
/*cbs.add(fn2);
cbs.fire('bar');
console.log('..........');
;*/
function callbacks(options){
var list = [];
var self;
var memory;
var firingStart;
function _fire(data){
memory = options === 'memory' && data;//===>&&>=
firingIndex = firingStart || 0;
firingStart = 0;//改变firingStart,之后的fire还是从0开始。
firingLength = list.length;
for(; list && firingIndex < firingLength; firingIndex++){
if(list[firingIndex](data) === false && options === 'stopOnFalse'){
break;
};
}
};
self = {
add: function(fn){
var start = list.length;
if(options === "unique"){
if(list.indexOf(fn) === -1){
list.push(fn);
}
}else{
list.push(fn);
} if(memory){
firingStart = start;//改变firingStart
_fire(memory);
}
},
fire: function(args){
if(list){
_fire(args);
if(options === "once"){
list = undefined;
}
}
}
};
return self;
}
var cc = callbacks("stopOnFalse");
cc.add(fn1);
cc.fire("111");
cc.add(fn2);
cc.fire("222");

jQuery memory&unique&stopOnfalse的更多相关文章

  1. 深入jQuery中的Callbacks()

    引入 初看Callbacks函数很不起眼,但仔细一瞅,发现Callbacks函数是构建jQuery大厦的无比重要的一个基石.jQuery中几乎所有有关异步的操作都会用到Callbacks函数. 为什么 ...

  2. jQuery.Callbacks 源码解读二

    一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...

  3. jquery源码 Callback

    工具方法.对函数的统一管理. jquery2.0.3版本$.Callback()部分的源码如下: // String to Object options format cache var option ...

  4. jquery源码解析:jQuery工具方法Callbacks详解

    我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...

  5. jquery源码01---(2880 , 3042) Callbacks : 回调对象 : 对函数的统一管理

    // optionsCache : { 'once memory' : { once : true , memory : true } } var optionsCache = {}; // once ...

  6. jQuery 第十章 工具方法-高级方法 $.ajax() $.Callbacks() .....

     $.ajax() $.Callbacks() $.Deferred() .then() $.when() ---------------------------------------------- ...

  7. JS搞基指南----延迟对象入门提高资料整理

    JavaScript的Deferred是比较高大上的东西,  主要的应用还是主ajax的应用,  因为JS和nodeJS这几年的普及,  前端的代码越来越多,  各种回调套回调再套回调实在太让人崩溃, ...

  8. What skills are needed for machine learning jobs

    What skills are needed for machine learning jobs?机器学习工作必须技能 原文: http://www.quora.com/Machine-Learnin ...

  9. jquery2.0.3 全部源码

    /*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...

随机推荐

  1. LA 3882 - And Then There Was One(约瑟夫 递归)

    看题传送门 题目大意: N个数排成一圈,第一次删除m,以后每k个数删除一次,求最后一被删除的数. 如果这题用链表或者数组模拟整个过程的话,时间复杂度都将高达O(nk),而n<=10000,k&l ...

  2. SQL Server 2008 Tempdb 数据库迁移

    1.首先检查数据文件位置及名称 SELECT name,physical_name FROM sys.database_files 2.迁移 USE master; GO ALTER DATABASE ...

  3. SiFive Unleashed启动

    SiFive Unleashed启动 请仔细参看SiFive官网的文档HiFive Unleashed 使用串口连接过程 连接好硬件(电源+USB) 尝试打开电源键,检测硬件能被识别 配置minico ...

  4. 【LeetCode】【C++】Linked list cycle 2

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  5. 【t048】水流

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 全球气候变暖,小镇A面临水灾.于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放 ...

  6. DOS命令具体解释

    net use $">\\ip\ipc$Content$nbsp;" " /user:" " 建立IPC空链接   net use $" ...

  7. <h2>1. mongodb介绍</h2>

    1. mongodb介绍 2. ppt下载地址 http://download.csdn.net/detail/u014285882/7807105 阅读全文 本文已收录于下面专栏: mongodb使 ...

  8. js进阶 12-4 jquery键盘事件如何使用

    js进阶 12-4 jquery键盘事件如何使用 一.总结 一句话总结:键盘和鼠标都是外设输入设备,所以函数很像,所以使用就像鼠标事件click一样 1.jquery键盘事件有哪三个? 1(up和do ...

  9. stackedit

    https://github.com/benweet/stackedit/ https://github.com/waltcow/blog/issues/4

  10. javascript的全局变量 分类: C1_HTML/JS/JQUERY 2014-08-07 11:03 562人阅读 评论(0) 收藏

    javascipt是一门面向对象的编程语言.由于存在一些全局属性及全局函数,因此可以认为存在一个全局变量,这些全局属性及全局函数均是其属性或函数. 在js核心中,并没有定义一个具体的全局变量,因此,j ...