Использование $ .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 () никогда не вызывается.

Кто-нибудь знает, как это сделать?

Ответы на вопрос(4)

Ваш ответ на вопрос