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, время: 09:03. |