2012-02-28 12 views
3

最近、私は、サーバーからjsonレスポンスをロードするスクリプトの問題に直面しました。私はjQuery.ajax()を使ってajax呼び出しを行っています。コードスニペットはそうです -jquery.ajaxを使用して大規模なjsonレスポンスを一貫して読み込むことができない

var request = $.ajax({ 
    url: "script.jsp", 
    type: "POST", 
    dataType: "json", 
    success: function(response) { 
    console.log(response); 
    }, 
    error: function(response, error) { 
    console.log(response, error); 
    } 
}); 

私はこのスクリプトが昨日ほど近かったと言いました。私は、サーバー側のコードまたはフロントエンドのコードを変更していません。 jsonのレスポンスは、サイズが〜1 MBと少し大きめです。しかし、私はjson出力を使って -

python -mjson.tool < output.json 

を正しく検証しました。好奇心が強いのはFF &クロムの違いです。

FFでは、Firebugを開いて、作成中のajaxリクエストを確認します。私は要求が約300msで提供されているが、コンソールのリンクの横にあるローディングホイールはまだ20秒間アニメートしていることがわかります。その後、jsonレスポンスが適切に処理され、その結果がページに表示されます。 IEでも同様の動作、20秒後にjsonの適切な処理。

Chromeでは、約20秒間何も起こりません。その後、コンソールにエラー"error": undefinedまたはFailed to load resourceのいずれかが表示されます。私は別のブラウザでこの奇妙な振る舞いを理解しない

POST script.jsp 
f.support.ajax.f.ajaxTransport.sendjquery.min.js:4 
f.extend.ajaxjquery.min.js:4 
DataTableWidget.extend._fetchBuildingBlockItemsPermissionBBItemsWidget.js:91 
(anonymous function)PermissionBBItemsWidget.js:83 
e.extend.eachjquery.min.js:2 
DataTableWidget.extend._loadDataPermissionBBItemsWidget.js:82 
DataTableWidget.extend.showPermissionBBItemsWidget.js:15 
(anonymous function)permission-building-blocks.html:451 
xLAB.min.js:5 
ULAB.min.js:5 
jLAB.min.js:5 
ILAB.min.js:5 
eLAB.min.js:5 
a.onload.a.onreadystatechange 

- あるいは、それはまた、以下のスタックトレースを出力します。サーバー側のコードは、高速応答を返す

  1. -

    だから、本質的に、私はことを確認して作られました。私はいくつかのデバッグステートメントを入れて、サーバーログを見た。レスポンス・フォーム・サーバは500ms以上はかかりません。
  2. jsonが正しく検証されていることを確認しました。 20秒後にIE & FFで処理されても何の問題もないという事実はその証拠です。 Pythonのjson.toolの使用に加えて。
  3. ので問題上の任意のポインタが大きな助けになります

をJSONにデータ型を設定します。ありがとう。

更新 私が気づいたもう1つ興味深いこと。リクエストが処理されている間に、元のリクエストから3秒以内にリフレッシュボタンを押すと、プロセスはすぐに完了します。私が1秒後に経過時間のビューの変化を見ると、リフレッシュイベントのためにページが消去されます。

更新2 大きなレスポンスをアルファベットでスライスした後で気づいたことがあります。ルーオン対応の問題は、特定のレスポンスでのみ発生します。私はこの長い応答ファイルをhttp://jsonformatter.curiousconcept.com/#jsonformatterで実行しましたが、すぐにjosnが有効であると返信しましたが、実際には応答を印刷するのに20秒以上かかります。私は問題が\u0026のような特定の文字のために起こっていると思うので、この情報を追加すると、どのように問題を解決できますか? Here is the snipet of the problematic json.

+0

おそらく需要に基づいてそのデータの一部を供給することを検討する時間?? – charlietfl

+0

@charlietfl私はそれについて考えましたが、なぜそれが昨日ではなく今日では動作するのか理解できません。また、私は他のページにも、全く問題のない同等の要求を出しています。 – Chantz

答えて

3

問題を見つけました。問題は、サーバー側のコードがクライアントサイドのJavaScriptにjson文字列をどのように提供したかで問題になりました。

私は実際にjspページ内のjson文字列をクライアントに渡す前に実際にレンダリングしたコードベースのレガシーメソッドを使用していました。これはどういうわけかレスポンスを台無しにしていた。このため、応答タイプはtext/htmlでした。

実際のアプリケーション/ json MIMEタイプストリームの応答に切り替えるとすぐに、すべてが正常でした。

0

JSONに改行がありますか?火かき棒や何かの線が開いていますか?ブラウザがJSONをうまく読み込んでいるかもしれませんが、デバッグツールが邪魔になるかもしれません。特定のツールで特定のJSON文字列を検査する際に問題があったことを思い出しました。改行コード(またはWindowsでわかっている改行文字)がないからです。私はコンソールにすべてのものを記録することはそれと関係がないのかどうか疑問に思っています。

+0

別の例を挙げます。あなたのオペレーティングシステムが何であるかはわかりません。実験のために、私はWindowsを想定します。 Windowsのメモ帳で長いラインフィード(おそらくあなたのJSONファイル)を開いてみてください。ロードには15/20秒かかることがあります。今では40年近くのエディタの最新のオープンソースの概念であるGVimのようなもので開くと、すぐに開くはずです。しかし、IIRCは、特定の設定では、それもメモ帳のように動作します。ほとんどのエディタは長い改行なしのファイルを処理するようには設計されていません。 – JayC

+0

私が編集者について話している唯一の理由は、ほとんどのデバッグ環境では、同様の問題(同様に貧弱な)も扱われているからです。 – JayC

+0

ありがとうございます。しかし、私は彼が問題を理解した。問題は、バックエンドがjson文字列でフロントエンドコードを提供していたことでした。私は、jspページで既にjson文字列を実際にプリントアウトし、それをフロントエンドに提供するレガシーメソッドを使用しました。応答を実際のアプリケーション/ json MIMEタイプのストリームに切り替えるとすぐに、すべてがうまくいきました。 – Chantz

関連する問題