2010-08-22 5 views
3

Я пытаюсь выполнить цикл с запросом JSON внутри него. Мой код выглядит примерно так:Javascript Json внутри цикла

for (var i = 0; i < numitems; i++) { 
    var currentitem = items[i]; 
    $.getJSON("http://localhost/items.php", {'itemname' : currentitem}, 
    function (json) { 
     alert (json); 
    }); 
} 

Но, похоже, для цикла, не дожидаясь запроса JSon, чтобы закончить и сразу же переходит к следующему. Возможно ли реализовать цикл (не обязательно должен быть цикл for), который выполняет текущий запрос JSON и переходит к следующему элементу массива после получения ответа от json?

Спасибо!

ответ

6
function nextItem(i) 
{ 
    if(i < numitems) 
    { 
    var currentitem = items[i]; 
    $.getJSON("http://localhost/items.php", {'itemname' : currentitem}, 
     function (json) { 
     alert (json); 
     nextItem(i + 1); 
     }); 
    } 
} 

nextItem(0); 

Положите это в том же месте, в котором у вас есть петля for (не перемещайте функцию).

+0

Хорошо старый рекурсии. Я попробую попробовать. Похоже, он отлично работает. –

0

$ .getJSON - это асинхронный вызов, означающий, что он возвращается почти мгновенно, но не завершается до определенного времени. Вот почему вы передаете ему обратный вызов - обратный вызов (т. Е. Функция, которую вы передаете в строке 4) - это то, что выполняется, когда запрос AJAX фактически завершается. The docs есть несколько подробнее.

Вы хотите переосмыслить свою стратегию здесь: если вы хотите, чтобы эти запросы выполнялись один раз в день, каждый из них должен быть вызван из обратного вызова предыдущего. Или вам просто придется иметь дело с асинхронным характером обратных вызовов; это может быть чрезвычайно полезно.

0

getJSON является асинхронным. Цикл не будет ждать ответа JSON.

Ваш код должен по-прежнему работать, однако ваше предупреждение() s будет отложено.

Если вы хотите, чтобы ждать ответа вам нужно будет сделать функцию обратного вызова итерацию по списку (мой пример, вероятно, не будет работать)

var items = [ "im", "not", "sure", "whats", "in", "here" ]; 

function bahJSON(index) { 
    if (!index) index=0; 
    var currentItem = items[index]; 
    $.getJSON("http://localhost/items.php", {"itemname": currentItem }, 
    function(json) { 
     alert(json); 
     if (index<items.length) { 
     bahJSON(index+1); 
     } 
    }); 
} 
bahJSON(); 
0

Следующая выполняет ответ JSON после предыдущего Ответ JSON был завершен:

function nextItem(i) { 
var currentitem = items[i]; 
$.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     url: "http://localhost/items.php", 
     data: "{'itemname' : currentitem}", 
     dataType: "json", 
     complete: function() { 
      if (i<numitems) { 
       i++; 
      nextItem(i); 
     } 

     }, 
     error: function(request, status, errorThrown) { 
      alert(status); 
     } 
    }); 
} 
Смежные вопросы