2011-01-27 75 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/