С использованием событийной (event-driven ) модели программирования появляется множество асинхронных вызовов, которые не всегда должны выполняться асинхронно. Чтобы упорядочить этот хаос я написал небольшой модуль, реализующий очередь.
/**
* @method add добавить функцию в очередь
* @method interate выполнить первую в очереди функцию и удалить ее из очереди
* @method clear очистить очередь
*/
var Queue = function () {
this.members = [];
};
Queue.prototype = {
add: function (f) {
if (f instanceof Function) {
this.members.push(f);
}
},
iterate: function () {
if (this.members.length > 0) {
var func = this.members.shift();
func.call(this);
}
},
clear: function () {
this.members = [];
}
};
При вызове функции, контекстом ее выполнения становится очередь. Перед тем как завершить свое выполнение каждая асинхронная функция должна позаботиться о вызове следующего элемента очереди через метод iterate.
function () {
// сохраняем контекст (очередь) в локальную переменную
var queue = this;
$.get('data.xml', function (data) {
// в этом месте this уже не ссылается на очередь
process(data);
// подолжаем исполнение очереди
queue.iterate();
});
}
Коментарии к заметке
А можно еще примеры? Я делал так: