JSON Parsing Weirdness - сломан или просто медленен? - PullRequest
0 голосов
/ 28 января 2011

В jQuery, парсинг точек для рисования на холсте HTML5.Обнаружена странная ошибка - но мои знания в этой области довольно ограничены, поэтому, возможно, есть хорошее объяснение.

Это работает каждый раз:

var json = $.getJSON( "../models/" + id + ".json");

alert("fjkld");

paths = JSON.parse(json.responseText);

Это терпит неудачу каждый раз:

var json = $.getJSON( "../models/" + id + ".json");

paths = JSON.parse(json.responseText);

Кто-нибудь знает, почему?Это потому, что предупреждение что-то приостанавливает, пока парсер «догоняет»?Это не имеет для меня интуитивного смысла, но это единственное объяснение.

На самом деле я знаю, что это правильно, потому что, если я нажму "ОК" в предупреждении очень быстро, оно снова не получится.кто-нибудь, пожалуйста, объясните мне, почему это происходит?

Ответы [ 4 ]

2 голосов
/ 28 января 2011

getJSON является асинхронным . Это означает, что он возвращается немедленно, до того как XMLHTTPRequest завершится. Поскольку alert является функцией блокировки, весь код останавливается до тех пор, пока вы не нажмете ОК. Если вы потратите некоторое время, запрос будет выполнен, поэтому responseText доступен; если alert отсутствует или вы нажимаете OK очень быстро, HTTP-запрос не выполнен, поэтому текст не завершен.

Вместо этого вам нужно использовать функцию обратного вызова: это функция, которая будет выполнена после выполнения запроса AJAX:

$.getJSON( "../models/" + id + ".json", function(paths) {
    // access paths here
});

См. Документацию для $.getJSON.

1 голос
/ 28 января 2011

Это происходит потому, что вызов getJSON является асинхронным.Когда вызов на getJSON завершен, все, что вы знаете, это то, что браузер запустил запрос на файл.Вы не знаете, был ли запрос выполнен или нет.Конечно, вызов функции оповещения дает браузеру достаточно времени (обычно), чтобы получить полный файл, но, как вы обнаружили, иногда это не так.файл был загружен:

$.getJSON(fileName, function(data) {
  paths = JSON.parse(data);
  ..do something with paths..
});

Хотя обратите внимание, что paths будет недоступен, пока не будет выполнен обратный вызов.

0 голосов
/ 28 января 2011

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

$.getJson("../models/" + id + ".json", function(response) {
    paths = JSON.pars(response.responseText);
});

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

http://api.jquery.com/jQuery.getJSON/

0 голосов
/ 28 января 2011

Вам нужно настроить функцию обратного вызова в вызове getJSON, чтобы убедиться, что ответ успел завершиться. В потоке вызова ajax функция, которая генерирует вызов getJSON, продолжается, пока происходит getJSON. Нет гарантии, что запрос json завершился при вызове JSON.parse (). Правильный синтаксис для вызова:

jQuery.getJSON( "../models/" + id + ".json", function(data, status, xhr){ JSON.parse(data);} ) 

Проверьте API для вызова getJson здесь: http://api.jquery.com/jQuery.getJSON/

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