Очередь на js

Нужно было сделать простенькую очередь, чтобы добавить много колбэков, а потом выполнить последний из очереди по таймауту, отсчитываемому от времени последнего добавления.
Очередь получилась простенькая (за полчаса много и не сделаешь).
Использование:

//опциональное время в милисекундах - таймаут от последнего события
var queue = queueFactory( 5000 );
// у меня дёргается скрипт по определённому событию, в нём написано
$( window ).bind( 'event1', function( Event, Data )
{
	if ( ! queue.length() ) {
		showLoader();
	}
	queue.add( function() { console.log( 'event1' ); } );
} );
$( window ).bind( 'event2', function( Event, Data )
{
	if ( ! queue.length() ) {
		showLoader();
	}
	queue.add( function() { console.log( 'event2' ); } );
} );

В итоге через 5 секунд после наступления последнего из событий в консоль выведется соответствующее сообщение.

Код:

var queueFactory = (function( Timeout )
{
	"use strict";
/**
 * Объект-реализация очереди
 *
 * @since  19.07.11
 * @author bullgare
 * @param int Timeout (мс) если передан, то очередь сама будет разгребаться с указанным таймаутом
 */
	var QueueObject = function( Timeout )
	{
		var _callbacks = [];
	// если не null, то при добавлении в очередь будет запускаться таймер на разгребание очереди
		var timeoutDelay = Timeout ? parseInt( Timeout ) : null;
		var currentTimeout = null;
	/**
	 * Добавить колбэк-функцию в очередь
	 *
	 * @since  19.07.11
	 * @author bullgare
	 * @param Callback колбэк-функция
	 */
		var _add = function( Callback )
		{
			_callbacks.push( Callback );

			if ( timeoutDelay )
			{
				if ( currentTimeout ) {
					clearTimeout( currentTimeout );
				}
				currentTimeout = setTimeout( function() {
					executeLastAndClear();
				}, timeoutDelay );
			}
		};
	//===========================================================================}}}
	/**
	 * Запустить последнюю функцию в очереди
	 *
	 * @since  19.07.11
	 * @author bullgare
	 */
		var _executeLast = function()
		{
			var lastCallback = _callbacks.pop();
			if ( typeof lastCallback !== 'undefined' ) {
				lastCallback();
			}
		};
	//===========================================================================}}}
	/**
	 * Очистить очередь
	 *
	 * @since  19.07.11
	 * @author bullgare
	 */
		var _clear = function()
		{
			_callbacks = [];
			currentTimeout = null;
		};
	//===========================================================================}}}
	/**
	 * @since  19.07.11
	 * @author bullgare
	 */
		var executeLastAndClear = function()
		{
			_executeLast();
			_clear();
		};
	//===========================================================================}}}

	// это объект с доступными методами
		return {
			add: _add,
			executeLastAndClear: executeLastAndClear,
			clear: _clear,
			length: function() { return _callbacks.length; }
		};
	};
//===========================================================================}}}
	return function( Timeout ) { return new QueueObject( Timeout ); };
}());

2 комментария so far.

  1. josh:
    Hi armalong,
    Do you get my comment?
    Thank you for supporting SweetCaptcha.com FREE project!
    ;-)

    Josh
    SweetCaptcha Support Group

LEAVE A COMMENT