Использование $ .Deferred () с вложенными вызовами ajax в цикле
Мы потратили слишком много часов на поиск похожих вопросов и поиск решений, поэтому я надеюсь, что у кого-то есть решение.
По сути, я хотел бы получить уведомление о завершении функции a (). Проблема в том, что функция содержит вызов ajax и цикл, который вызывает b (), который снова содержит вызов ajax.
ОБНОВЛЕНО С FIDDLE:http://jsfiddle.net/hsyj7/1/
Вот так:
// called by main()
function a() {
return $.ajax("http://url1").pipe(function(data){
for (var i = 0; i < 2; i++) {
console.log('a called');
b();
}
});
}
// called by a()
function b() {
for (var i = 0; i < 2; i++) {
$.ajax("http://url2", function(data){
// do something
console.log('b called');
}
}
}
function main(){
$.when(a()).done(function(){
console.log('all completed');
});
}
То, что я хотел бы видеть тогда, возможно с обоими вызовами к () наверху:
a called
b called
b called
a called
b called
b called
all completed
Вместо этого я получаю
a called
all completed
b called
b called
Или какой-то вариант.
Мне известно, что в приведенном выше коде отсутствует функция отсрочки как в цикле, так и в b (). В некоторых вариантах, которые я пробовал, обработчик done () в main () никогда не вызывается.
Кто-нибудь знает, как это сделать?