Таким образом, у меня есть массив данных 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);
,
Переходите через них, переходя каждый в. 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!
});