jQuery memory&unique&stopOnfalse
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的更多相关文章
- 深入jQuery中的Callbacks()
引入 初看Callbacks函数很不起眼,但仔细一瞅,发现Callbacks函数是构建jQuery大厦的无比重要的一个基石.jQuery中几乎所有有关异步的操作都会用到Callbacks函数. 为什么 ...
- jQuery.Callbacks 源码解读二
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
- jquery源码 Callback
工具方法.对函数的统一管理. jquery2.0.3版本$.Callback()部分的源码如下: // String to Object options format cache var option ...
- jquery源码解析:jQuery工具方法Callbacks详解
我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...
- jquery源码01---(2880 , 3042) Callbacks : 回调对象 : 对函数的统一管理
// optionsCache : { 'once memory' : { once : true , memory : true } } var optionsCache = {}; // once ...
- jQuery 第十章 工具方法-高级方法 $.ajax() $.Callbacks() .....
$.ajax() $.Callbacks() $.Deferred() .then() $.when() ---------------------------------------------- ...
- JS搞基指南----延迟对象入门提高资料整理
JavaScript的Deferred是比较高大上的东西, 主要的应用还是主ajax的应用, 因为JS和nodeJS这几年的普及, 前端的代码越来越多, 各种回调套回调再套回调实在太让人崩溃, ...
- What skills are needed for machine learning jobs
What skills are needed for machine learning jobs?机器学习工作必须技能 原文: http://www.quora.com/Machine-Learnin ...
- jquery2.0.3 全部源码
/*! * Includes Sizzle.js 选择器,独立的库 * http://sizzlejs.com/ */ (function( window, undefined ) { //" ...
随机推荐
- amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...
- <转> Intel VTune分析结果中的名词释译
原文转自http://blog.chinaunix.net/uid-26000296-id-3369740.html Elapsed Time(执行耗时): the total time your t ...
- HOOK钩子教程
[转载]HOOK钩子教程 http://blog.sina.com.cn/s/blog_675049f701019ka9.html(原贴) 先留着,好好学一学! 原文地址:HOOK钩子教程作者:X_T ...
- SIP对话、事务详解
1,SIP对话的建立(图片来自于网络) SIP对话的建立包括invite request,response,ACK.其中response包含临时响应(1XX response)和最终响应(非1XX r ...
- mysql触发器语法的一个实例
我要实现的功能是:在更新一个表时.从三个表中查询记录并插入到另外一个表中.以下是我写触发器的过程: 第一次写的触发器例如以下: CREATE TRIGGER istmingxi AFTER UPDA ...
- Injector Job深入分析 分类: H3_NUTCH 2015-03-10 15:44 334人阅读 评论(0) 收藏
Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...
- 并查集(disjoint set)的实现及应用
这里有一篇十分精彩.生动的 并查集详解 (转): "朋友的朋友就是朋友"⇒ 传递性,建立连通关系 disjoint set,并查集(一种集合),也叫不相交集,同时也是一种树型的数据 ...
- 【搜索引擎Jediael开发笔记】V0.1完整代码 2014-05-26 15:16 443人阅读 评论(0) 收藏
详细代码请见 E:\Project\[重要]归档代码\SearchEngine归档代码 或 https://code.csdn.net/jediael_lu/jediael/tree/10991c83 ...
- ETL概述 分类: H2_ORACLE 2013-08-23 10:36 344人阅读 评论(0) 收藏
转自:http://blog.csdn.net/leosoft/article/details/4279536 ETL,Extraction-Transformation-Loading的缩写,中文名 ...
- Android 使用binder访问service的方式
binder机制是贯穿整个Android系统的进程间访问机制,经常被用来访问service,我们结合代码看一下binder在访问service的情形下是怎么具体使用的. service 你可以理解成没 ...