Я думаю, проблема в том, что $.Deferred
и ему подобные предназначены для обработки асинхронных и параллельных процедур, поэтому вам всегда придется их как-то обманывать, если вы хотите, чтобы они действовали так, как вы это описываете.
Если вы хотите/нужно обрабатывать ваши вызовы один за другим (используя AJAX), я бы предложил поместить их в массив и использовать простую рекурсивную функцию для циклического прохождения этого массива до тех пор, пока все вызовы не будут выполнены. или один из них вышел из строя.
В основном это будет работать так:
var requests = [
{
url : '/serviceA'
data : myParams4ServiceA
},
...
{
url : '/serviceZ'
data : myParams4ServiceZ
}
];
Теперь, когда у вас есть массив запросов AJAX, вы можете создать рекурсивную функцию, которая будет обрабатывать их один за другим:
function work(){
$.ajax(requests[0]).done(function(data){
//handle data here
requests.shift(); //request is done and can be removed from the Array, request[0] will now be the next request in the queue
if (requests.length){
work(); //function calls itself again if there's still need for it
} else {
// we are done!
}
}).fail(function(e){
//call failed -> handle error
});
}
work();
См. эту скрипту для примера успешной цепочки и этот для цепочки, в которой произошел сбой.
Другой возможностью может быть установка вызовов AJAX на async : false
(обратите внимание, что это устарело в jQuery 1.8+: «Начиная с jQuery 1.8, использование async: false с jqXHR ($.Deferred) устарело; вы должны использовать обратные вызовы complete/success/error.", который снова указывает нам на резервное копирование), и используйте простую цепочку $.when().then().fail()
, которую вы применяете к своему массиву запросов, например:
$.when.apply($, requests).then(function(){
$.each(arguments, function(){
//do stuff with your data
});
}).fail(function(){
//handle the error
});
Поскольку ваши вызовы теперь блокируются, это также будет обрабатывать их подряд. См. также скрипку.
person
m90
schedule
08.10.2012
async: false
(отменив букву A в AJAX)? Или я неправильно понял ваш вопрос? - person m90   schedule 07.10.2012