返回值:jQueryjQuery.callbacks(flags)

概述

一個多用途的回調列表對象,提供了強大的的方式來管理回調函數列表。

$.Callbacks()的內部提供了jQuery的$.ajax() 和 $.Deferred() 基本功能組件。它可以用來作爲類似基礎定義的新組件的功能。

$.Callbacks() 支持的方法,包括 callbacks.add(),callbacks.remove()callbacks.fire() and callbacks.disable().

參數

flagsV1.7

一個用空格標記分隔的標志可選列表,用來改變回調列表中的行爲

示例

入門描述:

以下是兩個樣品的方法命名fn1 and fn2:

jQuery 代码:
function fn1( value ){

    console.log( value );

}



function fn2( value ){

    fn1("fn2 says:" + value);

    return false;

}

這些可以添加爲回調函數作爲一個$.Callbacks的列表,並調用如下:

var callbacks = $.Callbacks();

callbacks.add( fn1 );

callbacks.fire( "foo!" ); // outputs: foo!



callbacks.add( fn2 );

callbacks.fire( "bar!" ); // outputs: bar!, fn2 says: bar!

這樣做的結果是,它使構造複雜的回調列表變得簡單,輸入值可以通過盡可能多的函數根據需要輕松使用。

用于以上的两个具体的方法: .add() 和 .fire() .add() 支持添加新的回调回调列表, 而.fire() 提供了一种用于处理在同一列表中的回调方法的途径.

另一种方法由$.Callbacks 的remove(),用于从回调列表中删除一个特定的回调。下面是.remove() 使用的一个例子:

var callbacks = $.Callbacks();

callbacks.add( fn1 );

callbacks.fire( "foo!" ); // outputs: foo!



callbacks.add( fn2 );

callbacks.fire( "bar!" ); // outputs: bar!, fn2 says: bar!



callbacks.remove(fn2);

callbacks.fire( "foobar" ); 



// only outputs foobar, as fn2 has been removed.

支持的 Flags描述:

这个 flags 參數是$.Callbacks()的一个可选參數, 结构为一個用空格標記分隔的標志可選列表,用來改變回調列表中的行爲 (比如. $.Callbacks( 'unique stopOnFalse' )).

 

可用的 flags:

  • once: 确保这个回调列表只执行一次(像一个递延 Deferred).
  • memory: 保持以前的值和将添加到这个列表的后面的最新的值立即执行调用任何回调 (像一个递延 Deferred).
  • unique: 确保一次只能添加一个回调(所以有没有在列表中的重复).
  • stopOnFalse: 当一个回调返回false 时中断调用

默認情況下,回調列表將像事件的回調列表中可以多次觸發。

如何在理想情況下應該使用的flags的例子,見下文:

 

$.Callbacks( 'once' ):

var callbacks = $.Callbacks( "once" );

callbacks.add( fn1 );

callbacks.fire( "foo" );

callbacks.add( fn2 );

callbacks.fire( "bar" );

callbacks.remove( fn2 );

callbacks.fire( "foobar" );



/*

output: 

foo

*/

 

$.Callbacks( 'memory' ):

var callbacks = $.Callbacks( "memory" );

callbacks.add( fn1 );

callbacks.fire( "foo" );

callbacks.add( fn2 );

callbacks.fire( "bar" );

callbacks.remove( fn2 );

callbacks.fire( "foobar" );



/*

output:

foo

fn2 says:foo

bar

fn2 says:bar

foobar

*/

 

$.Callbacks( 'unique' ):

var callbacks = $.Callbacks( "unique" );

callbacks.add( fn1 );

callbacks.fire( "foo" );

callbacks.add( fn1 ); // repeat addition

callbacks.add( fn2 );

callbacks.fire( "bar" );

callbacks.remove( fn2 );

callbacks.fire( "foobar" );



/*

output:

foo

bar

fn2 says:bar

foobar

*//code>

 

$.Callbacks( 'stopOnFalse' ):

function fn1( value ){

    console.log( value );

    return false;

}



function fn2( value ){

    fn1("fn2 says:" + value);

    return false;

}



var callbacks = $.Callbacks( "stopOnFalse");

callbacks.add( fn1 );

callbacks.fire( "foo" );

callbacks.add( fn2 );

callbacks.fire( "bar" );

callbacks.remove( fn2 );

callbacks.fire( "foobar" );



/*

output:

foo

bar

foobar

*/

因为$.Callbacks() 支持一个列表的flags而不仅仅是一个,设置几个flags,有一个累积效应,类似“&&”。这意味着它可能结合创建回调名单,unique 和確保如果名單已經觸發,將有更多的回調調用最新的觸發值 (i.e.$.Callbacks("unique memory")).

 

$.Callbacks( 'unique memory' ):

function fn1( value ){

    console.log( value );

    return false;

}



function fn2( value ){

    fn1("fn2 says:" + value);

    return false;

}

    

var callbacks = $.Callbacks( "unique memory" );

callbacks.add( fn1 );

callbacks.fire( "foo" );

callbacks.add( fn1 ); // repeat addition

callbacks.add( fn2 );

callbacks.fire( "bar" );

callbacks.add( fn2 );

callbacks.fire( "baz" );

callbacks.remove( fn2 );

callbacks.fire( "foobar" );



/*

output:

foo

fn2 says:foo

bar

fn2 says:bar

baz

fn2 says:baz

foobar

*/

Flag结合体是使用的$.Callbacks()内部的.done() 和 .fail()一个递延容器-它们都使用 $.Callbacks('memory once').

$.Callbacks 方法也可以被分离, 为方便起见应该有一个需要定义简写版本:

var callbacks = $.Callbacks(),

    add = callbacks.add,

    remove = callbacks.remove,

    fire = callbacks.fire;



add( fn1 );

fire( "hello world");

remove( fn1 );

$.Callbacks, $.Deferred and Pub/Sub

pub / sub( Observer模式)背后的一般思路 是促进应用程序的松散耦合。而比对其他对象的方法调用的单个对象,一个对象,而不是另一个对象的一个特定的任务或活动,并通知当它发生。观察家也被称为订阅者,我们指的出版商(或主体)观察对象。出版商事件发生时通知用户

作为一个组件$.Callbacks()创造能力,它可以实现一个pub / sub系统只使用回调列表。使用$.Callbacks作为主题队列,发布和订阅的主题系统可以实现如下:

var topics = {};



jQuery.Topic = function( id ) {

    var callbacks,

        method,

        topic = id && topics[ id ];

    if ( !topic ) {

        callbacks = jQuery.Callbacks();

        topic = {

            publish: callbacks.fire,

            subscribe: callbacks.add,

            unsubscribe: callbacks.remove

        };

        if ( id ) {

            topics[ id ] = topic;

        }

    }

    return topic;

};

然後,可以很容易的使用這部分應用程序的發布和訂閱感興趣的事件:

// Subscribers

$.Topic( "mailArrived" ).subscribe( fn1 );

$.Topic( "mailArrived" ).subscribe( fn2 );

$.Topic( "mailSent" ).subscribe( fn1 );



// Publisher

$.Topic( "mailArrived" ).publish( "hello world!" );

$.Topic( "mailSent" ).publish( "woo! mail!" );



// Here, "hello world!" gets pushed to fn1 and fn2

// when the "mailArrived" notification is published

// with "woo! mail!" also being pushed to fn1 when

// the "mailSent" notification is published. 



/*

output:

hello world!

fn2 says: hello world!

woo! mail!

*/

雖然這是有用的,可以采取進一步的實施。使用$.Deferreds,這是可能的,以確保發表者只爲用戶發布一次特別的任務已經完成(解決)通知。這可能是如何在實踐中使用的一些進一步的評論,請參見下面的代碼示例:

// subscribe to the mailArrived notification

$.Topic( "mailArrived" ).subscribe( fn1 );



// create a new instance of Deferreds

var dfd = $.Deferred();



// define a new topic (without directly publishing)

var topic = $.Topic( "mailArrived" );



// when the deferred has been resolved, publish a 

// notification to subscribers

dfd.done( topic.publish );



// Here the Deferred is being resolved with a message

// that will be passed back to subscribers. It's possible to

// easily integrate this into a more complex routine

// (eg. waiting on an ajax call to complete) so that

// messages are only published once the task has actually

// finished.

dfd.resolve( "its been published!" );