О функции getJSON в jQuery - PullRequest
       31

О функции getJSON в jQuery

1 голос
/ 16 января 2012
{
   "Adam":{
      "Math":"93",
      "Science":"96",
      "Email":"adam@example.com",
      "City":"NY"
   },
   "Tom":{
      "Math":"65",
      "Science":"56",
      "Email":"tom@example.com",
      "City":"LA"
   },
   "Joe":{
      "Math":"74",
      "Science":"83",
      "Email":"joe@example.com",
      "City":"Washington"
   }
}

Выше приведен контент JSON, представленный на http: //ActualUrl/path.json

Я обращаюсь к файлу JSON и заполняю два массива именами и метками в науке с помощью кода ниже.

     var names=[];
     var marks=[];
    $.getJSON("http://path.json",function(data){               
                $.each(data, function(key, val) {   
                     names.push(key);
                    // I placed alert the check the value key.
            marks.push(parseInt(val.Science));                  
                    });
                });
    alert(names.toString()); // names is found blank
    alert(marks.toString()); 

Когда я проверяю массив в конце.Массив найден пустым.Почему это неправильное поведение с getJSON?Я поместил предупреждение в каждом и проверить значение.Возвращает правильное значение.

Ответы [ 3 ]

4 голосов
/ 16 января 2012

$.getJSON срабатывает асинхронно, что означает, что в большинстве случаев оно не завершится к тому времени, когда вы прочитаете свои переменные.Вам нужно будет реструктурировать свое решение таким образом, чтобы вы делали то, что хотите, в рамках его обратного вызова:

$.getJSON("http://path.json", function(data) {
    $.each(data, function(key, val) {
        names.push(key);
        marks.push(parseInt(val.Science));
    });

    // do your thing here.
});
2 голосов
/ 16 января 2012

Основная проблема

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

  1. Вы выполняете вызов ajax.Запрос отправлен на сервер.

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

  3. Сервер отвечает, ваш обратный вызов сработал, а массивы заполнены.Слишком поздно.

Решение:

Поместить в обратный вызов логику оповещения.

Другие примечания

jQuery.each для итерацииколлекции.У вас, с другой стороны, есть объект (или словарь).

Попробуйте этот код:

for(key in data) {
  names.push(key);
  var val = data[key];
  marks.push(parseInt(val.Science));                  
}

for ... in ... Конструкция итерирует свойства объекта, что вам и нужно.

0 голосов
/ 16 января 2012

$. Each Описание: перебирать объект jQuery, выполняя функцию для каждого соответствующего элемента. (от: http://api.jquery.com/each/)

Возвращенный JSON - это не объект jQuery, а простой объект JavaScript. Вместо этого используйте foreach (введите данные).

Ох и переместите оповещение () внутри функции обратного вызова:)

...