jQuery deferred chain tasks
Добрый вечер, уважаемые форумчане.
В ходе написания скрипта для определенной задачи я наткнулся на сложность. Нужна помощь. Итак, работаю с jQuery.Deferred Задача - несколько независимых очередей ajax-запросов с задержкой. Подробнее: - есть $.Deferred объект, реализующий очередь ajax запросов с определенными параметрами. По отдельности такие "цепочки" работают отлично. - необходимо запустить выполнение нескольких таких deferred-объектов в цикле, но с задержкой. Т.е. первый запускается сразу, остальные через N-секунд. - "проблема" в том, что выполнение всех запросов асинхронно и отсчет задержки нужно начинать после завершения работы первой очереди.
function test () {
var df = $.Deferred();
/* ... выполняется цепочка ajax-запросов, после завершения которых вызывается df.resolve();*/
return df.promise();
};
var obj = test();
//для примера
obj.done(function() {
//do something
});
А теперь нужно реализовать запуск этих объектов один за другим НО с определенной задержкой. Количество "звеньев" этой цепочки зависит от кол-ва элементов массива Array. При каждом выполнении выбирается первый элемент последством Array.shift(); *ниже приведен НЕ работающий код, который собственно и нужно заменить рабочим Что-то типа такого.
$.when(test()).done(function() {
var callback = this.done;
if(array.length > 0) {
setTimeout(function() {
$.when(test()).done(callback);
}, 5000);
} else {
//end
}
});
p.s. я слаб в JS, если что-то не так сильно не ругайте. Буду рад подсказкам и наставлениям на правильный путь. Заранее всем спасибо |
Решение найдено
Может кому пригодится. Решил задачу примерно вот так:
function dispach() {
return $.Deferred(function(dispached) {
var f = function() {
$.when(function() {
return $.Deferred(function(dfd){
// ...
//do something, resolve dfd-object on complete
// ...
}).always(function(){
if(!stopped && array.length > 0) { //stopped - на случай необходимости прервать цепочку
console.log('wait 4 sec');
setTimeout(f, 4000);
} else dispached.resolve();
});
}).done(function(v) {
console.log('Done '+v);
});
} // end-f
f();
}).done(function(){
console.log('Done ALL');
});
}
На идею подтолкнул вот этот код :) |
| Часовой пояс GMT +3, время: 11:49. |