JSON解析怪异 - 破碎还是慢?

时间:2011-01-27 23:16:28

标签: javascript json parsing

在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 个答案:

答案 0 :(得分:2)

getJSON 异步。这意味着它在XMLHTTPRequest完成之前立即返回。由于alert是阻止函数,因此在按下“确定”之前,所有代码都将暂停。如果您需要一段时间,请求已完成,因此responseText可用;如果alert不存在,或者您很快按OK,则HTTP请求尚未完成,因此文本尚未完成。

您需要使用回调函数:这是一个在AJAX请求完成时执行的函数:

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

See the documentation for $.getJSON

答案 1 :(得分:1)

这是因为getJSON调用是异步的。完成对getJSON的调用后,您只知道浏览器已启动该文件的请求。您不知道请求是否已完成。当然,对alert功能的调用为浏览器提供了足够的时间(通常)来获取完整的文件,但正如你有时发现的那样,这不是真的。

更好的是提供一个文件下载后将被调用的回调:

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

虽然请注意paths在回调执行之前不可用。

答案 2 :(得分:0)

您需要在getJSON调用中设置回调函数,以确保响应有时间完成。在ajax调用的流程中,生成getJSON调用的函数在getJSON发生时继续。当调用JSON.parse()时,无法保证json请求已完成。调用的正确语法是:

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

在这里查看getJson调用的api:http://api.jquery.com/jQuery.getJSON/

答案 3 :(得分:0)

将你的逻辑放在回调中。

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

或类似的东西。由于请求API调用是异步调用,因此必须等待服务器响应才能继续。这就是回调的来源。当请求完成时,它们由异步API调用。他们通常还有成功状态标志,告诉您您的请求是否成功。

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