jQuery.Callbacks()方法


实例

向 $.Callbacks 的列表添加回调函数

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. function fn2( value ) {
  6. fn1("fn2 says: " + value);
  7. return false;
  8. }
  9. var callbacks = $.Callbacks();
  10. callbacks.add( fn1 );
  11. // 输出: foo!
  12. callbacks.fire( "foo!" );
  13. callbacks.add( fn2 );
  14. // 输出: bar!, fn2 says: bar!
  15. callbacks.fire( "bar!" );
  16. })
运行一下 »

定义和用法

$.Callbacks() 指一个多用途的回调函数列表对象,提供了一种强大的方法来管理回调函数列对。

提示: $.Callbacks 是在 jQuery 内部使用,如为 .ajax,$.Deferred 等组件提供基础功能的函数。它也可以用在类似功能的一些组件中,如自己开发的插件。

语法

$.Callbacks( flags )

参数 描述
flags 可选。 String类型 一个用空格标记分隔的可选列表,用来改变回调列表中的行为

更多实例

下面是使用 .remove() 从回调列表中删除一个特定的回调的例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. function fn2( value ) {
  6. fn1("fn2 says: " + value);
  7. return false;
  8. }
  9. var callbacks = $.Callbacks();
  10. callbacks.add( fn1 );
  11. // 输出: foo!
  12. callbacks.fire( "foo!" );
  13. callbacks.add( fn2 );
  14. // 输出: bar!, fn2 says: bar!
  15. callbacks.fire( "bar!" );
  16. callbacks.remove( fn2 );
  17. // 只输出 foobar, fn2 已经被移除。
  18. callbacks.fire( "foobar" );
  19. })

运行一下 »

支持的 Flags 参数

这个 flags 参数是 $.Callbacks() 的一个可选参数, 结构为一个用空格标记分隔的标志可选列表,用来改变回调列表中的行为 (比如. $.Callbacks( 'unique stopOnFalse' ))。
以下是可用的 flags:

参数 描述
once 确保这个回调列表只执行一次
memory 缓存上一次fire时的参数值,当add()添加回调函数时,直接用上一次的参数值立刻调用新加入的回调函数
unique 确保一次只能添加一个回调,不会重复添加
stopOnFalse 某个回调函数返回false之后中断后面的回调函数

下面是 $.Callbacks( "once" ) 的一个例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. function fn2( value ) {
  6. fn1("fn2 says: " + value);
  7. return false;
  8. }
  9. var callbacks = $.Callbacks( "once" );
  10. callbacks.add( fn1 );
  11. callbacks.fire( "foo" );
  12. callbacks.add( fn2 );
  13. callbacks.fire( "bar" );
  14. callbacks.remove( fn2 );
  15. callbacks.fire( "foobar" );
  16. /*只输出:foo*/
  17. })
运行一下 »

下面是 $.Callbacks( "memory" ) 的一个例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. function fn2( value ) {
  6. fn1("fn2 says: " + value);
  7. return false;
  8. }
  9. var callbacks = $.Callbacks( "memory" );
  10. callbacks.add( fn1 );
  11. callbacks.fire( "foo" );
  12. callbacks.add( fn2 );
  13. callbacks.fire( "bar" );
  14. callbacks.remove( fn2 );
  15. callbacks.fire( "foobar" );
  16. /*输出 :
  17. foo
  18. fn2 says:foo
  19. bar
  20. fn2 says:bar
  21. foobar
  22. */
  23. })
运行一下 »

下面是 $.Callbacks( "unique" ) 的一个例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. function fn2( value ) {
  6. fn1("fn2 says: " + value);
  7. return false;
  8. }
  9. var callbacks = $.Callbacks( "unique" );
  10. callbacks.add( fn1 );
  11. callbacks.fire( "foo" );
  12. callbacks.add( fn1 ); // repeat addition
  13. callbacks.add( fn2 );
  14. callbacks.fire( "bar" );
  15. callbacks.remove( fn2 );
  16. callbacks.fire( "foobar" );
  17. /*输出:
  18. foo
  19. bar
  20. fn2 says:bar
  21. foobar
  22. */
  23. })
运行一下 »

下面是 $.Callbacks( "stopOnFalse" ) 的一个例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. return false;
  5. }
  6. function fn2( value ) {
  7. fn1( "fn2 says: " + value );
  8. return false;
  9. }
  10. var callbacks = $.Callbacks( "stopOnFalse" );
  11. callbacks.add( fn1 );
  12. callbacks.fire( "foo" );
  13. callbacks.add( fn2 );
  14. callbacks.fire( "bar" );
  15. callbacks.remove( fn2 );
  16. callbacks.fire( "foobar" );
  17. /*输出:
  18. foo
  19. bar
  20. foobar
  21. */
  22. })
运行一下 »

$.Callbacks() 支持一个列表设置多个flags(标识)而不仅仅是一个,有一个累积效应,类似"&&"。
下面是 $.Callbacks( 'unique memory' ) 的一个例子

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. return false;
  5. }
  6. function fn2( value ) {
  7. fn1( "fn2 says: " + value );
  8. return false;
  9. }
  10. var callbacks = $.Callbacks( "unique memory" );
  11. callbacks.add( fn1 );
  12. callbacks.fire( "foo" );
  13. callbacks.add( fn1 ); // repeat addition
  14. callbacks.add( fn2 );
  15. callbacks.fire( "bar" );
  16. callbacks.add( fn2 );
  17. callbacks.fire( "baz" );
  18. callbacks.remove( fn2 );
  19. callbacks.fire( "foobar" );
  20. /*输出:
  21. foo
  22. fn2 says:foo
  23. bar
  24. fn2 says:bar
  25. baz
  26. fn2 says:baz
  27. foobar*/
  28. })
运行一下 »

$.Callbacks 方法也可以被分离, 例如:

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. }
  5. var callbacks = $.Callbacks(),
  6. add = callbacks.add,
  7. remove = callbacks.remove,
  8. fire = callbacks.fire;
  9. add( fn1 );
  10. fire( "hello world" );
  11. remove( fn1 );
  12. /*输出:hello world*/
  13. })
运行一下 »

$.Callbacks, $.Deferred 和 Pub/Sub

pub / sub(观察者模式)背后的一般思路是促进应用程序的松散耦合和高效通信。观察家也被称为订阅者,它指向观察对象。观察者(Publisher)事件发生时通知用户。

作为 $.Callbacks() 的创建组件的一个演示,只使用回调函数列表,就可以实现 Pub/Sub 系统。将 $.Callbacks 作为一个文章队列,可以向下面这样,实现文章的发布和订阅:

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. return false;
  5. }
  6. function fn2( value ) {
  7. fn1( "fn2 says: " + value );
  8. return false;
  9. }
  10. var topics = {};
  11. jQuery.Topic = function( id ) {
  12. var callbacks,
  13. method,
  14. topic = id && topics[ id ];
  15. if ( !topic ) {
  16. callbacks = jQuery.Callbacks();
  17. topic = {
  18. publish: callbacks.fire,
  19. subscribe: callbacks.add,
  20. unsubscribe: callbacks.remove
  21. };
  22. if ( id ) {
  23. topics[ id ] = topic;
  24. }
  25. }
  26. return topic;
  27. };
  28. // 订阅者
  29. $.Topic( "mailArrived" ).subscribe( fn1 );
  30. $.Topic( "mailArrived" ).subscribe( fn2 );
  31. $.Topic( "mailSent" ).subscribe( fn1 );
  32. // 发布者
  33. $.Topic( "mailArrived" ).publish( "hello world!" );
  34. $.Topic( "mailSent" ).publish( "woo! mail!" );
  35. /*输出:
  36. hello world!
  37. fn2 says: hello world!
  38. woo! mail!*/
  39. })
运行一下 »

进一步改进使用 $.Deferreds,可以保证当特定的任务被完成(或被解决)时,发布者只能向订阅者发布通知。参见下面的示例代码:

实例

  1. $(function () {
  2. function fn1( value ) {
  3. alert( value );
  4. return false;
  5. }
  6. function fn2( value ) {
  7. fn1( "fn2 says: " + value );
  8. return false;
  9. }
  10. var topics = {};
  11. jQuery.Topic = function( id ) {
  12. var callbacks,
  13. method,
  14. topic = id && topics[ id ];
  15. if ( !topic ) {
  16. callbacks = jQuery.Callbacks();
  17. topic = {
  18. publish: callbacks.fire,
  19. subscribe: callbacks.add,
  20. unsubscribe: callbacks.remove
  21. };
  22. if ( id ) {
  23. topics[ id ] = topic;
  24. }
  25. }
  26. return topic;
  27. };
  28. // 订阅 mailArrived 通知
  29. $.Topic( "mailArrived" ).subscribe( fn1 );
  30. // 创建一个新对象替代延迟$.Deferreds
  31. var dfd = $.Deferred();
  32. // 定义一个新的文章 (不直接发布)
  33. var topic = $.Topic( "mailArrived" );
  34. // 当延迟被受理, 发布一个通知给订阅者
  35. dfd.done( topic.publish );
  36. /*这里将被回传给订阅者的消息延迟被受理,
  37. 它尽可能整合了复杂的程序(例如等待一个
  38. Ajax调用完成),所以事实上消息只发布了
  39. 一次。*/
  40. // 完成。
  41. dfd.resolve( "已经被发布!" );
  42. })
运行一下 »