2011-01-27 73 views
0

在jQuery中,解析一组要在HTML5画布上绘制的点。遇到了一个奇怪的错误 - 但我对这方面的知识相当有限,所以也许有一个很好的解释。JSON解析奇怪 - 破碎还是慢?

这个屡试不爽:

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

alert("fjkld"); 

paths = JSON.parse(json.responseText); 

这个失败每次:

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

paths = JSON.parse(json.responseText); 

任何人有任何想法,为什么?是否因为解析器“赶上”时警报暂停了某些事情?这对我来说并不直观,但它是唯一的解释。

其实我知道这是正确的,因为如果我在提醒上点击“OK”确实很快就会失败。

有人可以向我解释为什么会发生这种情况吗?

回答

2

getJSON异步。这意味着它在XMLHTTPRequest完成之前立即返回。由于alert是一个阻止功能,因此所有代码都会暂停,直到您按下“确定”。如果你花了一段时间,请求已经完成,所以responseText可用;如果alert不存在,或者您非常快速地按OK,则HTTP请求尚未完成,因此文本尚未完成。

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

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

See the documentation for $.getJSON

+0

谢谢 - 这很有帮助。 – pendevere 2011-01-27 23:24:17

+0

根据http://api.jquery.com/jQuery.getJSON/`callback`应该是第三个参数,第二个是发送数据。没有它会起作用吗? – 2011-01-27 23:25:05

1

发生这种情况是因为getJSON调用是异步的。一旦完成对getJSON的调用,您知道浏览器已经启动了对该文件的请求。您不知道请求是否已完成。当然,对警报函数的调用使浏览器有足够的时间(通常)来获取完整文件,但正如您发现有时并非如此。

远越好,以提供一个一旦文件被下载,将调用回调:

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

但请注意,直到回调执行paths将不可用。

0

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

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

退房的API的调用的getJSON这里:http://api.jquery.com/jQuery.getJSON/

0

把你的逻辑回调里面。

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

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

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