2016-11-10 2 views
1

Итак, у меня есть функция, которая блокирует как это:Подождите асинхронный .done() в каждой итерации цикла

function getMainData() { 
    var dfd = $.Deferred(); 

    $.getJSON('My string that i pass', 
     function(result) { 
      if (result !== undefined) { 
       dfd.resolve(result); 
      } 
     }) 

    return dfd.promise() 
} 

function getSpecificData() { 
    var dfd = $.Deferred(); 

    var myArray = []; 

    for (var i = 0; i < 5; i++) { 
     getMainData().done(function(result) { 
      myArray.push(result) 

      dfd.resolve(myArray) //This is where I am lost. 
     }) 
    } 

    return dfd.promise() 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}) 

Я думаю, что я знаю, как обещает работать, если вы приковать их вместе, но я не могу сделать for-loop для ожидания завершения асинхронного вызова до следующей итерации.

Может кто-нибудь, пожалуйста, помогите мне?

ответ

2

Для цикла цикла нет средств для отсрочки следующей итерации для ожидания асинхронного кода.

Вы можете решить, используя функцию, которая вызывается рекурсивно вместо

function getMainData() { 
    return $.getJSON('My string that i pass'); 
} 

function getSpecificData() { 
    var myArray = [], def = new $.Deferred(); 

    (function rec(i) { 
     getMainData().done(function(result) { 
      myArray.push(result); 
      if (i < 5 && result !== undefined) { 
       console.log(i) 
       rec(++i); 
      } else { 
       def.resolve(myArray); 
      } 
     }); 
    })(0); 

    return def.promise(); 
} 

getSpecificData().done(function(result) { 
    console.log(result); 
}); 
+0

Спасибо за решение, это сработало хорошо, и я фактически не думал о рекурсивных методах. – Zorken17

0

Вы пробовали без promise как:

var myArray = []; 
var cpt=0; 
var total=5; 

getMainData(); 
console.log(myArray); 

function getMainData() 
{ 
    $.getJSON('My string that i pass', function(result) { 
     if(cpt<total) 
     { 
      myArray.push(result); 
      cpt++; 

      getMainData(); 
     } 
    }) 
} 

Надеется, что это помогает.

1

Вы должны использовать все обещания в массиве и ждать, пока все закончится.

+0

Спасибо за хорошее решение, но это не работает должным образом. Я не получаю значения от всех моих асинхронных вызовов. Это означает, что цикл не ожидает асинхронного вызова. – Zorken17

+0

@ Zorken17 Вы можете использовать переменную arguments, чтобы получить полный список возвратов вместо переменной результата –

Смежные вопросы