jQuery.Callbacks之demo
jQuery.Callbacks是jquery在1.7版本之后加入的,是从1.6版中的_Deferred对象中抽离的,主要用来进行函数队列的add、remove、fire、lock等操作,并提供once、memory、unique、stopOnFalse四个option进行一些特殊的控制,这是jquery的官方文档:http://api.jquery.com/jQuery.Callbacks/
这个函数常见的应用场景是事件触发机制,也就是设计模式中的观察者(发布、订阅机制),目前Callbacks对象用于queue、ajax、Deferred对象中,这篇文章主要是一些简单的demo:
1、不传入任何参数,调用add的时候将函数add到内部的list中,调用fire的时候顺序触发list中的回调函数
function fn1(val){
console.log('fn1 says:' + val);
}
function fn2(val){
console.log('fn2 says ' + val);
}
var cbs = $.Callbacks();
cbs.add(fn1);
//fn1 says:foo
cbs.fire('foo');
cbs.add(fn2);
//fn1 says:bar
//fn2 says bar
cbs.fire('bar');
2、构造函数传入once,回调函数列表只被fire一次
function fn1(val){
console.log('fn1 says ' + val);
}
var cbs = $.Callbacks('once');
cbs.add(fn1);
//fn1 says foo
cbs.fire('foo');
cbs.fire('foo');
3、构造函数传入memory,这个选项刚开始接触时有点费解,下面拿个具体例子说明一下
function fn1(val){
console.log('fn1 says ' + val);
}
function fn2(val){
console.log('fn2 says ' + val);
}
var cbs = $.Callbacks('memory');
cbs.add(fn1);
//第一次fire会缓存传入的参数
//fn1 says foo
cbs.fire('foo');
//fire过一次之后,以后的add都会自动调用fire,传入的参数是上次fire传入的'foo'
//fn2 says foo
cbs.add(fn2);
//此次fire的参数新传入的'bar'
//fn1 says bar
//fn2 says bar
cbs.fire('bar');
4、构造函数传入unique,保证在add过程中没有重复的函数
function fn1(val){
console.log('fn1 says ' + val);
}
var cbs = $.Callbacks('unique');
cbs.add(fn1);
cbs.add(fn1);
//虽然添加了两次,但因为有unique这个选项,所以只会有一次输出
//fn1 says foo
cbs.fire('foo');
5、构造函数传入stopOnFalse,当顺序调用函数列表的时候,如果某一个函数的返回值为false,则break
function fn1(val){
console.log('fn1 says ' + val);
}
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.add(fn2);
cbs.add(fn3);
//虽然add了三个函数,但是因为fn2的返回值是false,所以不会执行fn3这个函数
//fn1 says foo
//fn2 says foo
cbs.fire('foo');
上面是一些单选项的demo,下面来看几个复合选项的例子
6、once、memory的组合,这个也是jquery中Deferred对象初始化大部分Callbacks对象的参数(为什么Deferred会用这对组合呢?因为这个对象只能resolve或者reject一次,改变为成功或者失败的状态之后不能再次改变,所以不能再次显示调用fire,而只能通过add的方式继续)
function fn1(val){
console.log('fn1 says ' + val);
}
function fn2(val){
console.log('fn2 says ' + val);
}
var cbs = $.Callbacks('once memory');
cbs.add(fn1);
//fn1 says foo
cbs.fire('foo');
//因为memory的缘故,此次add自动fire,并且因为once和memory的共同原因,每次执行完之后函数队列都自动清空,所以这次只执行fn2,不执行fn1
//fn2 says foo
cbs.add(fn2)
//因为once的缘故,显示调用fire也不会执行,如果还想fire,则只能add
cbs.fire('bar');
7、memory stopOnFalse的组合
function fn1(val){
console.log('fn1 says ' + val);
}
function fn2(val){
console.log('fn2 says ' + val);
return false;
}
function fn3(val){
console.log('fn3 says ' + val);
}
var cbs = $.Callbacks('stopOnFalse memory');
cbs.add(fn1);
cbs.add(fn2);
cbs.add(fn3);
//因为stopOnFalse的缘故,这里执行fn2后的返回值是false,所以不会执行fn3
//fn1 says foo
//fn2 says foo
cbs.fire('foo');
cbs.add(fn2);
cbs.add(fn3);
//这里其实内部的函数队列是[fn1, fn2, fn3, fn2, fn3],但因为执行第一个fn2的返回值是false,所以[fn1, fn2, fn3, fn2, fn3]中标红的函数不会执行
//fn1 says bar
//fn2 says bar
cbs.fire('bar');
这篇文章主要是几个option的应用,下次会先对源代码进行解读,然后针对源代码设计几个更高级的应用,敬请期待
jQuery.Callbacks之demo的更多相关文章
- jQuery.Callbacks之源码解读
在上一篇jQuery.Callbacks之demo主要说了Callbacks对象初始化常见的选项,这一篇主要分析下Callbacks对象的源代码,对给出两个较为繁琐的demo // String to ...
- jQuery: Callbacks
jQuery 中提供了一个Callback的工具类Callbacks,它提供了一个Callback Chain.使用它可以在一个chain上来执行相关操作.它也是jQuery中的ajax, Defer ...
- jQuery回调、递延对象总结(上篇)—— jQuery.Callbacks
前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...
- jQuery.Callbacks 源码解读二
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
- jQuery源代码学习之四——jQuery.callbacks
自己实现的callbacks模块相较于jquery源代码中的callbacks模块有所简化,表面上看没有考虑firing这个参数,没有对之进行任何处理,即没有考虑在函数执行过程中,再次调用add,re ...
- jQuery回调、递延对象总结(一)jQuery.Callbacks详解
前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...
- 代码:jquery自定义插件 demo
jquery自定义插件 demo 2016-1-13 只是一个简易的示例 <script type="text/javascript" src="http://cd ...
- jQuery.callbacks 注释
(function( jQuery ) { // String to Object flags format cache var flagsCache = {}; // Convert String- ...
- 实时更新数据的jQuery图表插件DEMO演示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- 浅析/dev/shm
一,/dev/shm 概念 /dev/shm 是一个tmpfs文件系统,临时文件系统,是基于内存的文件系统,也就是说/dev/shm中的文件是直接写入内存的,而不占用硬盘空间. 在Centos和Red ...
- 二.TimesTen原理及应用场景
声明:本文章转自麻袋爸爸 一,TimesTen应用场景 在谈论TimesTen内存数据库应用场景之前,我们先来介绍一下什么是内存数据库,及其工作原理吧.内存数据库,顾名思义就是将数据存放在内存中,并通 ...
- 关闭电脑SSD的磁盘碎片整理
小白往往会把机械硬盘时代的习惯带进固态硬盘时代,比如碎片整理.机械硬盘时代砖家最喜欢告诉小白:“系统慢了吧?赶紧碎片整理撒.”小白屁颠屁颠地整理去了.殊不知碎片整理对于SSD来说完全就是种折磨.这种“ ...
- 【leetcode】Palindrome Number
题目简述: Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could n ...
- CozyRSS开发记录20-CanResizeWithGrip
CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...
- CozyRSS开发记录18-番外之Atom1.0的支持
CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...
- Spring 自带的定时任务
需要几天后,或者某个时间后,定时查询数据.需要用到Spring自带的一个注解 @Scheduled(cron="0/5 * * * * ? ")//每隔5秒钟执行 创建一个clas ...
- Codeforces Round #260 (Div. 2)
A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...
- 转行|如何成为企业想要的Android工程师
没经验 一来没钱 二来没时间 三来投简历没人要 四来就算忽悠进去了,也做不了,亚历山大,迟早被踢 1.做好手上的工作 不要裸辞 忌讳心猿意马的心态,当有两个选择的时候,往往 所以要专注于当下手头上唯一 ...
- Difference between WCF and Web API and WCF REST and Web Service
The .Net framework has a number of technologies that allow you to create HTTP services such as Web S ...