Javascript Json внутри цикла - PullRequest
       3

Javascript Json внутри цикла

3 голосов
/ 23 августа 2010

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

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

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

Спасибо!

Ответы [ 4 ]

6 голосов
/ 23 августа 2010
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 голосов
/ 23 августа 2010

Следующая команда выполняет ответ 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);
        }
    });
}
0 голосов
/ 23 августа 2010

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

Ваш код все еще должен работать, однако ваши оповещения () будут задержаны.

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

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 голосов
/ 23 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...