jQuery Deferreds - последовательный вызов массива Deferreds

0

Таким образом, у меня есть массив данных dataCalls отложенными объектами.

На данный момент я использую следующее, чтобы запустить их всех, и вызовите обратный вызов, как только все Отложенные решения разрешат:

$.when.apply(null, dataCalls)
   .always(callback);

Он работает нормально. В настоящее время проблема заключается в том, что каждый отложенный в dataCalls срабатывает одновременно. как я могу заставить их стрелять подряд - я думаю о Deferred.then, и каким-то образом apply() массив к then() но это предполагает, что у вас есть Отсрочка, чтобы начать, чего у меня нет.

Я думаю, возможно, перебираю массив и передавая каждый объект "Отложенный" в предыдущий метод "Отложенный" then(). Затем выполните следующие действия:

$.when(dataCalls[0])
   .always(callback);

Есть идеи?

Редактировать:

Это был долгий день, позвольте мне убрать этот вопрос, чтобы он мог быть полезен кому-то еще, надеюсь.

В противоположность тому, что я впервые написал, у меня на самом деле есть массив объектов Deferred.promise(), dataCalls.

Затем это передается в:

$.when.apply(null, dataCalls)
   .always(callback);

так что обратный вызов вызывается, когда все обещания разрешены.

Поскольку объекты Deferred, которые возвращают каждое обещание, уже были вызваны, и (в другом коде не показаны) этот процесс выполняется очень быстро, каждый Deferred запускается одновременно.

Чтобы заставить Deferreds стрелять подряд, мне нужно вместо этого создать массив с каждым объектом в массиве, являющимся функцией, которая возвращает указанное обещание.

Затем я могу выполнить цикл над массивом, выполнить функцию, которая возвращает обещание, а затем передать следующий объект в массиве в метод.then() обещания, который вызовет функцию, которая будет вызвана, когда обещание будет разрешено.

Последнее обещание может быть передано обратно в $.when(promise).always(callback); ,

  • 1
    во-первых, вам нужно прекратить создание массива dataCalls. Вызовы отправляются, пока вы генерируете массив объектов обещаний. покажи нам этот код.
  • 0
    @KevinB Хорошо, немного тупой момент, каждый объект в моем массиве на самом деле является функцией, которая возвращает Deferred.promise (). Затем этот массив передается в $ .when.apply (null, array);
Показать ещё 4 комментария
Теги:
asynchronous
promise
jquery-deferred

1 ответ

2
Лучший ответ

Переходите через них, переходя каждый в. Then

var reqArr = [{url: "somepage.php"},{url: "somepage1.php"},{url: "somepage2.php"}];

var req = $.ajax(reqArr.shift());
$.each(reqArr,function(i,obj){
    req.then(function(){
        return $.ajax(obj);
    });
});

req.done(function(){
    //They are all done!
});
  • 0
    Я вижу, что вы сделали, но я заключил эту логику в Отложенные. У меня есть только обещание. Но Deferred выполняется при немедленном вызове, и $ .when просто ждет выполнения обещания, я считаю, поэтому я думаю, что мне нужно немного реорганизовать свой код.
  • 0
    Если у вас есть обещание, то запрос уже отправлен. так что, да, вам придется немного изменить его.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню