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 ) { //" ...
随机推荐
- VMware Ubuntu安装具体过程
不是每个程序猿都必须玩过linux,仅仅是博主认为如今的非常多server都是linux系统的,而自己属于那种前端也搞.后台也搞,对框架搭建也感兴趣,可是非常多生产上的框架和工具都是安装在server ...
- Spring Boot + Jersey
Jersey是一个很好的Java REST API库.当你用Jersey实现REST的时候.是很自然的.同一时候Spring Boot是Java世界中还有一个很好的工具.它降低了程序的应用配置(< ...
- Vue实现上传图片功能
前言: 用vue实现上传图片功能,效果图如下: 先说文件上传控件样式美化怎么做,我有两种方法. 1.先上代码 html部分: <div class="pics-wrapper" ...
- vue项目对axios的全局配置
标准的vue-cli项目结构(httpConfig文件夹自己建的): api.js: //const apiUrl = 'http://test';//测试域名,自己改成自己的 const apiUr ...
- Android内存优化杂谈
Android内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作: 优化RAM,即降低运行时内存.这里的目的是防止程序发生OOM异常,以及降低程序由于内存过大被LMK机制杀死的概 ...
- 算法求解中的变量、数组与数据结构(STL 中的容器)
本质上算法都是对数据的操作,没有数据,没有存储数据的容器和组织方式,算法就是无源之水无本之木,就是巧妇也难为无米之炊.算法是演员,变量.数组.容器等就是舞台, 然后整个算法的处理流程,都是针对这些数据 ...
- 【Lucene4.8教程之五】Luke 2014-06-24 15:12 1092人阅读 评论(0) 收藏
一.Luke基本内容 1.Luke简介 Luke可用于查看Lucene创建的索引,并对其进行基本操作. 2.创建Luke (1)从Github上下载源文件 https://github.com/tar ...
- 建立简单的服务器端程序 分类: B1_JAVA 2013-10-08 21:53 503人阅读 评论(0) 收藏
参考自core java package com.lujinhong.corejava; import java.io.IOException; import java.io.InputS ...
- STS 3.6.4 SpringMVC 4.1.6 Hibernate 4.3.8 MySQL
开发环境: Java 1.8 Spring Tool Suite 3.6.4 Spring faramework 4.1.6 Hibernate 4.3.8 Maven 2.9 数据库是MySQL 5 ...
- 【u015】兽径管理
[问题描述] 约翰农场的牛群希望能够在 N 个(1<=N<=200)草地之间任意移动.草地的编号由 1到N.草地之间有树林隔开.牛群希望能够选择草地间的路径,使牛群能够从任一 片草地移动到 ...