【问题标题】:JSON Parsing Weirdness - Broken or Just Slow?JSON解析怪异——坏了还是慢了?
【发布时间】:2011-01-27 23:16:28
【问题描述】:

在 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);

有人知道为什么吗?是因为警报在解析器“赶上”时暂停了某些东西吗?这对我来说没有直观意义,但这是唯一的解释。

实际上我知道这是正确的,因为如果我在警报上快速点击“确定”,它会再次失败。

有人可以向我解释为什么会这样吗?

【问题讨论】:

    标签: javascript json parsing


    【解决方案1】:

    getJSON异步的。这意味着它会在 XMLHTTPRequest 完成之前立即返回。因为alert 是一个阻塞函数,所以所有代码都会暂停,直到您按下 OK。稍等片刻,请求已经完成,所以responseText可用;如果alert 不存在,或者您很快按OK,则HTTP 请求尚未完成,因此文本尚未完成。

    你需要使用回调函数来代替:这是一个将在 AJAX 请求完成时执行的函数:

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

    See the documentation for $.getJSON.

    【讨论】:

    • 谢谢——这很有帮助。
    • 根据api.jquery.com/jQuery.getJSON callback 应该是第三个参数,第二个是data 正在发送。没有它还能用吗?
    • @German data 参数是可选的。如果第二个参数是一个函数,则将其视为success 回调。
    【解决方案2】:

    这是因为getJSON 调用是异步的。一旦对getJSON 的调用完成,您所知道的就是浏览器已经启动了对该文件的请求。您不知道请求是否已完成。当然,对 alert 函数的调用给了浏览器足够的时间(通常)来获取完整的文件,但正如您发现的那样,有时这不是真的。

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

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

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

    【讨论】:

    • 谢谢..是的,现在有人指出这一点似乎很明显:-)
    【解决方案3】:

    您需要在 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/

    【讨论】:

      【解决方案4】:

      将您的逻辑放入回调中。

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 2022-09-30
        • 2020-07-26
        • 2018-12-22
        相关资源
        最近更新 更多