jQuery Callbacks应用关键点

87 篇文章 0 订阅

转自:http://blog.csdn.net/woxueliuyun/article/details/46124477

Callbacks是jQuery 1.7引入的方法,用于管理一系列使用相同参数的回调函数。所有回调函数(以下简称回调)保存在一个数组中,可以重复调用。其本质相当于一个回调函数列(List),因此可以做添加、删除、清空回调函数等操作。

生成回调列(Callbacks)

[javascript]  view plain copy
  1. var callbacks = $.Callbacks();  

回调执行顺序

回调保存在数组中,然后通过for循环遍历,所以列中的回调按照被添加的顺序依次执行,最后添加的一般最后执行。

[javascript]  view plain copy
  1.   
[javascript]  view plain copy
  1. // Fire the items on the list  
  2. var foo = function( value ) {  
  3.   console.log( "foo:" + value );  
  4. };  
  5.   
  6. // Add another function to the list  
  7. var bar = function( value ){  
  8.   console.log( "bar:" + value );  
  9. };  
  10.   
  11. var callbacks = $.Callbacks();  
  12.   
  13. callbacks.add( foo );  
  14. callbacks.add( bar);  
  15.   
  16. callbacks.fire("hello");   
  17. // output: foo: hello  
  18. // output: bar: hello  

唯一例外的情况是如果标记是memory,如果之前fire()被调用过,那么新的回调被add()添加之后会立刻使用前一个fire的参数执行一遍。但add()之前被fire()调用过的回调,如果没有使用fire()或fireWith(),不会马上再执行一遍。

四个标记:once, memory, unique, stopOnFalse

  • Once:列中的每一个回调最多执行一遍,执行完成之后,回调函数列被清空。
  • Memory:记住前一次fire()的参数,新回调一旦被添加就立即使用上一次的参数执行一遍(之前添加的回调不执行)。
  • Unique:同一个回调不能重复添加。
  • stopOnFalse:如果某个回调如果返回false,那么后面的回调都不会再执行。

标记设置方式举例:

[javascript]  view plain copy
  1. var callbacks = $.Callbacks("once memory");  

其它关键点

调用callbacks.disable()之后,callbacks无法再被enabled

调用disable()之后,回调函数列就被清空了,此时使用fire或fireWith都不会有任何响应。因此,Callbacks没有提供enable方法,因为所有回调已经被清空了,没有再enable的必要。

回调函数中调用Callbacks的fire()或fireWith()

有一种情况是在回调中又调用了callbacks的fire()或fireWith(),这种情况该怎么办?jQuery是这样做的:在回调中使用fire()或fireWith(),callbacks只是保存了fire()或fireWith()的参数,并没有立即执行列中的回调。只有当callbacks中的所有回调执行完之后,新的参数才会被callbacks中的回调利用。

[javascript]  view plain copy
  1. function fn1( value ){  
  2.    console.log( value );  
  3.    
  4.    if (value == "bar!"return false;  
  5.    
  6.    callbacks.fire("bar!");  
  7. }  
  8.    
  9. function fn2( value ){  
  10.   console.log( "fn2 says: " + value);  
  11. }  
  12.    
  13. var callbacks =$.Callbacks("stopOnFalse");  
  14.    
  15. callbacks.add( fn1 );  
  16. callbacks.add( fn2 );  
  17.    
  18. // Outputs: foo!  
  19. // Outputs: fn2 says:foo!  
  20. // Outputs: bar!  
  21. callbacks.fire("foo!" );  

callbacks.lock()

回调列被锁死,再调用callbacks.fire()或callbacks.fireWith()都将失效。

如果是在回调中调用了callbacks.lock(),则有一点需要注意:

  • callbacks有memory标记:当前fire()或fireWith()方法中没有执行的回调会继续执行,但回调中的callbacks.fire()和callbacks.fireWith()都不会再起作用。
  • callbacks无memory标记:所有回调全部被清空,也就是说后面的回调都不再执行。

奇怪的是Callbacks没有提供unlock方法,也就是说,一旦被locked,Callbacks就永久失去了调用fire()或fireWith()的能力。

版权声明:本文为博主原创文章,未经博主允许不得转载。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值