3

非常に動的な Web アプリケーションで jsonp ロング ポーリングを実行する必要がありますが、大量のメモリ リークが発生しています。最初に、Socket.IO と jsonp トランスポートを使用して同じ結果を得てから、JQuery テスト ページをセットアップして、問題が socket.io ライブラリだけに限定されているかどうかを確認しました。驚いたことに、JQuery から jsonp ポーリングを行っても同じ結果が得られることがわかりました。

彼はクライアント側のテストコードです:

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">        
    <script type="text/javascript">
        $(document).ready( function() {
            var doPoll = function() {
                $.ajax({
                    type: 'GET',
                    url: "http://<server-url>/jquery-jsonp/server.php",
                    cache: false,
                    async: true,
                    crossDomain: true,
                    dataType: "jsonp",
                    success: function (data, status) {
                        console.log("Received response"+data);
                        doPoll();
                    },
                    error: function (xhr, textStatus, errorThrown) {
                        // access denied
                    }
                });
            }

            doPoll();     
        });
    </script>
</head>

そして、ここにダミーのサーバー応答があります:

<?php echo $_GET['callback']."(".json_encode(array("status"=>"success")).")";

ご覧のとおり、ここでは特別なことは何もありません。これの原因と考えられる回避策について何か考えはありますか?

リクエストはクロスオリジンで実行する必要があり、IE8/9 をサポートする必要があります。どうもありがとうございました。

4

3 に答える 3

1

doPoll()次のように、数秒間隔で呼び出してみてください。

success: function (data, status) {
    console.log("Received response"+data);
    setTimeout(doPoll, 10000); // 10 second wait before next request sent
},
于 2012-11-19T11:16:19.540 に答える
0

すべての提案は有効であり、0.5秒ごとにサーバーをポーリングする必要がある場合でも、JavaScriptに少し休止して、メモリのクリアを開始できるように、数ミリ秒のタイムアウトを追加する必要があります。

もう1つの問題は、JSONPにあります。これにより、DOMの応答で新しいタグが作成されます。未使用のノードの削除を開始する必要があります。そうしないと、ページのサイズが無期限に大きくなり、最終的にメモリが不足します。

于 2012-11-19T12:56:55.487 に答える
0

応答を受け取った瞬間にポーリングする必要はありません。HTTP 送信は、通常のコンピューター操作に比べて遅くなる場合がありますが、通常は人間の反応よりも少し高速です。少なくとも数秒の遅延は良い考えです。

とはいえ、HTTP ポーリングはせいぜい信頼性が低いことに注意する必要があります。HTML の facebook チャットを、それがいかに信頼できないかを示す指標として取り上げてください。

編集:

皆さん、回答ありがとうございます。このアプリでは、次のリクエストを遅らせることはできません

次に、これにWebページを使用しないでください。代わりに、デスクトップまたはモバイル アプリを作成してください。あなたの回答が「それも選択肢ではありません」の場合。その場合、実行可能なオプションは存在しません。HTTP/HTML/Javascript は、「ユーザーに毎秒配信される非常に動的で重要なビジネス更新」を意図したものではありません。

于 2012-11-19T11:18:01.103 に答える