Slyweb
На разработку сайта! Скидки 50%!
Поиск функций jQuery
поиск



Характеристика функции

$.Callbacks() поддерживает несколько встроенных методов callbacks.add(),callbacks.remove(), callbacks.fire() and callbacks.disable().

Допустим у нас есть две функции fn1 и fn2:

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!" ); // выведет: foo!

callbacks.add( fn2 );
callbacks.fire( "bar!" ); // выведет: bar!, fn2 says: bar!

Многоцелевой список функций поддерживает использование функция для и работы с ним - .add(), .fire() и .remove().

Метод add() добавляет функцию в список callback, метод fire() обеспечивает возможность передач аргументов в функцию.

Объект $.Callbacks() поддерживает различные флаги для регулирования запускаемых функций:

  1. once: список выполняемых функций будет запущен единожды.
  2. memory: запоминает последнее значение, возвращаемое методом fire() и добавляет в очередь новый метод callback.
  3. unique: обеспечивает выполнение метода add единожды.
  4. stopOnFalse: прекращает выполнение функций в очереди объекта в случае, если одна и них возвращает false.

Используем флаг once:

<script type="text/javascript">
$(function(){
function fn1( value ){
    console.log( value );
}

function fn2( value ){
    fn1("fn2 says:" + value);
    return false;
}
	var callbacks = $.Callbacks( "once" );
	callbacks.add( fn1 );
	callbacks.fire( "foo" );
	callbacks.add( fn2 );
	callbacks.fire( "bar" );
	callbacks.remove( fn2 );
	callbacks.fire( "foobar" );
	 
});
</script>

Используем флаг memory:

<script type="text/javascript">
$(function(){
	function fn1( value ){
		console.log( value );
	}

	function fn2( value ){
		fn1("fn2 says:" + value);
		return false;
	}
		var callbacks = $.Callbacks( "memory" );
		callbacks.add( fn1 );
		callbacks.fire( "foo" );
		callbacks.add( fn2 );
	

	 
});
</script>


Используем флаг stopOnFalse:

<script type="text/javascript">
$(function(){

	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" );

});
</script>

Метод $.Callbacks одновременно может поддерживать несколько флагов - $.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 ); // добавили ещё раз
callbacks.add( fn2 );
callbacks.fire( "bar" );
callbacks.add( fn2 );
callbacks.fire( "baz" );
callbacks.remove( fn2 );
callbacks.fire( "foobar" );

/*
результат:
foo
fn2 says:foo
bar
fn2 says:bar
baz
fn2 says:baz
foobar
*/

Дополнительный пример:

var callbacks = $.Callbacks(),
    add = callbacks.add,
    remove = callbacks.remove,
    fire = callbacks.fire;

add( fn1 );
fire( "hello world");
remove( fn1 );


Основная идея метода $.Callbacks() – создание возможности отслеживания готовности одного объекта с целью выполнения другого, например как это показано ниже:

<script type="text/javascript">
$(function(){

	function fn1( value ){
		console.log( value );
		return false;
	}

	function fn2( value ){
		fn1("fn2 says:" + value);
		return false;
	}

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!
*/

});
</script>

Метод $.Callbacks() допустимо использовать совместно с объектом $.Deferred:

// 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 );

// далее с помощью объекта Deffered определённая задача может быть
// отслежена. Это удобно для выполнения отсроченных функций, например, при успешном
// завершении ajax запроса. 
// Сообщение будет выведено после того как завершится выполнение процесса.

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


Александр Ермаков. Хостинг - www.pwstudio.org