Мне нужно запустить несколько запросов ajax на сервер, а затем запустить обратный вызов, когда они будут завершены. Обычно это было бы легко сделать с помощью jQuery deferred.done()
. Однако, чтобы не перегружать сервер, я ставлю запросы в очередь и запускаю их каждые X миллисекунд.
e.g
var promisesList = [];
var addToQueue = function(workflow) {
workflowQueue.push(workflow);
}
var startWorkflow = function(workflow) {
return $.ajax($endointURL, {
type: "POST",
data: {
action: workflow.id
},
success: function() {
},
error: function(jqXHR, textStatus, errorThrown) {
}
});
};
var startWorkflows = function() {
var promisesList = [];
if (workflowQueue.length > 0) {
var workflow = workflowQueue.shift();
promisesList.push(startWorkflow(workflow));
setTimeout(startWorkflows, delay);
}
};
startWorkflows();
$.when(promisesList).done(function(){
//do stuff
});
Проблема в том, что массив promisesList
изначально пуст, поэтому обратный вызов done()
срабатывает немедленно, а затем запросы ajax начинают отправляться массивом setTimeout()
. Есть ли простой способ сначала создать запросы ajax и как бы «приостановить» их, а затем запустить их с помощью setTimeout()
.
Я нашел различные реализации дросселя/очереди для последовательного запуска ajax-запросов, но я рад, что они выполняются параллельно, просто с задержкой.
setTimeout
с произвольной задержкой не вариант? - person SpaceBison   schedule 04.07.2014setTimout()
, проблема заключается в обработке объектовdeferred
. - person Mark   schedule 04.07.2014