2

ajax を介して間隔を置いて json データをロードすると、奇妙な動作が発生します。データは正常にロードされますが、数回のインターバルの後、データがスクランブルされ、インターバル間で実行され続けます。これにより、ブラウザがクラッシュすることさえあります

htmlページ

<script id="source" language="javascript" type="text/javascript">
$(function ahitRate() 
{
    $.ajax({
    cache: false,
    url: 'average.php',
    data: 'jsonData',
    dataType: 'json',
    processData: false,
    success: function(data)
            {
                var ahr = data[0];              //get id
                var hitRate = data[1];           //get name
                $('#output').html("<b>id: </b>"+ahr+"<b> name:   </b>"+hitRate); 
                setInterval(ahitRate, 5000);
                }           
    });
}); 
</script>

ランダム データを生成する json php コード

// Session
session_start();

// Set the JSON header
header("Content-type: text/json");
header('Cache-Control: no-cache, must-revalidate');

$y = rand(0, 100);

// Create a PHP array and echo it as JSON
$ret = array("Average", $y);
echo json_encode($ret);
?>

これを解決する方法はありますか?

4

2 に答える 2

2

ああ、神様!

これを再帰的に呼び出しています!

setInterval(ahitRate, 5000);

編集: setInterval(...) を setTimeout(ahitRate, 5000); に変更するだけです。

実行するたびに、古いものが続き、新しいものが追加されるため、ますます多くのメモリが使用されます!

$(function() {
    function ahitRate() 
    {
         $.ajax({
         cache: false,
         url: 'average.php',
         data: 'jsonData',
         dataType: 'json',
         processData: false,
         success: function(data)
                    {
                         var ahr = data[0];              //get id
                         var hitRate = data[1];           //get name
                         $('#output').html("<b>id: </b>"+ahr+"<b> name:   </b>"+hitRate); 
                         }           
         });
    } 

    setInterval(ahitRate, 5000);

});

唯一の違いは、私が次のことです。

  1. ajax 成功関数内から setInterval(...) メソッドを削除しました
  2. クロージャの最後に 1 回だけ呼び出しました ("$(function() { ... } );"

これにより、「ahitRate()」関数が 5 秒ごとに呼び出されます。

于 2012-05-02T00:30:48.767 に答える
1

setInterval は発火し続け、新しい応答を受け取るたびに、新しいタイマーを開始します。したがって、5 秒後に最初のタイマーが起動し、別のタイマーが開始されます。その後、10 秒後に両方のタイマーが起動し、さらに 2 つのタイマーが開始されます。

これがどこに向かっているのかがわかると思います。

setTimeout() メソッドを探しているか、成功関数の外でインターバル タイマーを開始するだけなので、再度呼び出されることはありません。

于 2012-05-02T00:31:53.760 に答える