Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.04.2012, 21:46
Новичок на форуме
Отправить личное сообщение для lexeo Посмотреть профиль Найти все сообщения от lexeo
 
Регистрация: 09.04.2012
Сообщений: 2

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

Заранее всем спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 10.04.2012, 03:51
Новичок на форуме
Отправить личное сообщение для lexeo Посмотреть профиль Найти все сообщения от lexeo
 
Регистрация: 09.04.2012
Сообщений: 2

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

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');
  });
}


На идею подтолкнул вот этот код
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически загружаемая jQuery и jQuery-функции в одном файле 67bytes Общие вопросы Javascript 6 06.03.2013 08:01
2 разных модуля на jQuery - как подключить? finder jQuery 4 23.03.2012 21:29
отключить jQuery Awilum jQuery 0 19.11.2010 22:10
jQuery jTreeMenu plugin Seafnox jQuery 9 12.01.2010 21:55
JQuery + FireFox NOOB jQuery 4 02.11.2009 18:16