Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery deferred chain tasks (https://javascript.ru/forum/jquery/27334-jquery-deferred-chain-tasks.html)

lexeo 09.04.2012 21:46

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, если что-то не так сильно не ругайте. Буду рад подсказкам и наставлениям на правильный путь.

Заранее всем спасибо

lexeo 10.04.2012 03:51

Решение найдено
 
Может кому пригодится. Решил задачу примерно вот так:

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