在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);
任何人都知道为什么?是因为当解析器“赶上”时警报暂停了吗?这对我来说没有直观意义,但这是唯一的解释。
实际上我知道这是正确的,因为如果我在警报上点击“确定”真的很快就会再次失败。
有人可以向我解释为什么会这样吗?
答案 0 :(得分:2)
getJSON
异步。这意味着它在XMLHTTPRequest完成之前立即返回。由于alert
是阻止函数,因此在按下“确定”之前,所有代码都将暂停。如果您需要一段时间,请求已完成,因此responseText
可用;如果alert
不存在,或者您很快按OK,则HTTP请求尚未完成,因此文本尚未完成。
您需要使用回调函数:这是一个在AJAX请求完成时执行的函数:
$.getJSON( "../models/" + id + ".json", function(paths) {
// access paths here
});
答案 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调用。他们通常还有成功状态标志,告诉您您的请求是否成功。