2011-01-27 3 views
0

jQueryでは、HTML5キャンバス上に描画する点の束を解析します。奇妙なバグに遭遇しましたが、この分野に関する私の知識はかなり限られているので、良い説明があるかもしれません。JSON解析の奇妙さ - 壊れているか、ちょうど遅いですか?

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

paths = JSON.parse(json.responseText); 

誰もがなぜ任意のアイデアを持っている:これは毎回失敗し

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

alert("fjkld"); 

paths = JSON.parse(json.responseText); 

これは、すべての時間を動作しますか?パーサーが「キャッチアップ」している間、アラートが何かを一時停止するからですか?それは私に直感的な意味を持っていませんが、それは唯一の説明です。

実際に私はこれが正しいことを知っています。本当に速いアラートで「OK」を押すと再び失敗します。

誰かがなぜこれが起こっているのか説明してもらえますか?

答えて

2

getJSONは、であり、非同期である。つまり、XMLHTTPRequestが完了する前にすぐに戻ります。 alertはブロック機能であるため、[OK]を押すまですべてのコードが停止します。しばらく時間がかかると、リクエストは完了しているので、responseTextが利用可能です。 alertが存在しないか、または[OK]をすばやく押すと、HTTP要求が完了していないため、テキストは完了していません。

代わりにコールバック関数を使用する必要があります。

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

See the documentation for $.getJSON:これは、AJAX要求が完了したときに実行される機能です。

+0

ありがとうございます。 – pendevere

+0

http://api.jquery.com/jQuery.getJSON/第3引数である 'callback'によると、2番目の引数は' data'です。それなしでは動作しますか? –

+0

@German 'data'引数はオプションです。 2番目の引数が関数の場合、それは 'success'コールバックとして扱われます。 – lonesomeday

1

これは、getJSON呼び出しが非同期であるために発生します。 getJSONへの呼び出しが完了すると、ブラウザがファイルの要求を開始したことがわかります。要求が完了したかどうかはわかりません。確かに、アラート関数を呼び出すとブラウザに十分な時間が与えられ(通常は)、完全なファイルを取得できますが、時にはそれが真実ではないことが分かりました。

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

ノートがコールバックが実行されるまでpathsが使用できないこと:

はるかに優れたファイルがダウンロードされた後に呼び出されるコールバックを提供することです。

+0

ありがとうございます。 – pendevere

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/

0

をコールバックの内側にあなたのロジックを入れてください。

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

などです。要求API呼び出しは非同期呼び出しであるため、サーバー応答を待ってから進むことができます。そこにコールバックが入ります。要求が完了すると、非同期APIによって呼び出されます。彼らは通常あなたのリクエストが成功したかどうかを伝える成功ステータスフラグも持っています。

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

関連する問題