Я попытался прочитать много ответов на stackoverflow, но большинство проблем кажется немного проще, чем у меня. Я хочу сделать следующее:jQuery отложен сложный последовательный цикл
- выполнить цикл for различной длины, который извлекает строки таблицы через запрос ajax.
- как только у меня есть все строки, я хочу получить статистику, через другой запрос ajax
- после того, как у меня есть статистика, мне нужно отправить сообщение на сервер, который выполняет другой вызов бесплатной базы данных память (о да, я общаюсь с каким-то старым веб-сервисом за всем этим).
Вот мой код:
var chainedPromise = new Array();
//Build a .then() chain by assignment
for (i = 0; i < requests.length; i++) {
(function(i){
chainedPromise = $.when().then(function(){
return get_results_ajax(table, idRows, requests[i-1], requests[i], type, cfg.siteroot);
});
})(i);
}
var Promise = $.when(chainedPromise).then(function(){
return get_stats_ajax(table, idRows, type, cfg.siteroot);
}).then(function() {
return get_free_ajax(table,idRows, type, cfg.siteroot);
});
запросов содержит список номеров: [100, 200, 300, 400] до 5000. Каждый запрос должен отправить обратно 100 строк таблицы. Это работает правильно.
Не работает то, что статистика и свободная операция выполняются ПОСЛЕ того, как я получил все данные. Таким образом, цепочка последних двух вызовов должна быть выполнена по-разному, очевидно, но я не понимаю, как именно это должно быть сделано.
Аякса звонки сделаны так:
function get_results_ajax(table, idRows, start, stop, type, siteroot) {
var deferred = jQuery.Deferred();
var request = jQuery.ajax({
type : 'POST'
url : siteroot+"/index.php?page=ajax",
data : "type="+type+"&idRows="+idRows+"&start="+start+"&stop="+stop,
dataType : 'json',
});
request.success(function(data) {
table.rows.add(data).draw();
});
request.done(function(msg, textStatus, jqXHR) {
if (jqXHR.status === 200) {
deferred.resolve(jqXHR.responseText);
}
console.log("Returned data from " + start + " to " + stop);
});
request.fail(function(msg, textStatus, jqXHR) {
console.log("The server is taking too long to respond. Start: " + start + " Stop: " + stop);
deferred.reject("HTTP error: " + jqXHR.status);
});
return deferred.promise();
}
Ваши 1, 2 и 3 звучат как [Reactive Extensions.] (Https://github.com/Reactive-Extensions/RxJS) с некоторыми пользовательскими функциями ajax. –