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. SVGALib

    SVGALib是一套运行于Linux及FreeBSD下的开放源代码低阶绘图函式库,它允许程式设计人员变更视讯模式及全屏幕图像,许多热门的电脑游戏如Quake及Doom都源自此技术. 范例 编辑 #in ...

  2. (转)Bash 快捷键 完整版

    转自:http://www.opsers.org/linux-home/base/full-version-of-bash-keyboard-shortcuts.html#toc-3 生活在 Bash ...

  3. complex query几个原则

    1.一般来说in比exists更有利(更容易变成join). 2.尽量避免union,使用union all代替,避免sort. 3,绝对不能在没有on条件下使用join(除非有特殊目的). 4.ou ...

  4. 屏蔽OCulus Rift的官方警告的方法实测

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/45870243 作者:car ...

  5. .NET Framework基础知识(五)(转载)

    .程序集:是 .NET Framework 应用程序的构造块:程序集构成了部署.版本控制.重复使用.激活范围控制和 安全权限的基本单元. .程序集的优点:版本控制问题.最终解决DLL冲突 .程序集分为 ...

  6. Android 在ListView中嵌套ListView的事件处理

    前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Ite ...

  7. 小雷FansUnion:我有了第一个付费客户(第一个徒弟)

    很高兴地告诉大家一个振奋人心的消息,我刚刚拥有了第一个付费客户. 第一个付费客户是山东青岛的一个上班族,有2年.Net经验,今年转Java开发.对我比较信任,在我的建议下,选择了"拜师学艺& ...

  8. centos7安装nginx的两种方法

    第一种方式:通过yum安装 直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中 运行下面的命令: 1.将nginx放到y ...

  9. Android 虚拟机学习总结Dalvik虚拟机介绍

    1.Dalvik虚拟机与Java虚拟机的最显著差别是它们分别具有不同的类文件格式以及指令集.Dalvik虚拟机使用的是dex(Dalvik Executable)格式的类文件,而Java虚拟机使用的是 ...

  10. keepalived小结

    keepalived 启动流程: 启动三个进程(主进程.healthcheck 进程.vrrp进程)之后,先进入backup状态,运行一次vrrp_script成功后发现没有主,这时候会进入maste ...