Json数据奇怪的行为

时间:2012-05-02 00:25:13

标签: php jquery html ajax json

当通过带有间隔的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>

<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); ?>

// 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); ?>

有任何建议如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

OMG!

你是在递归地调用它!

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成功函数
  2. 中删除了setInterval(...)方法
  3. 在闭包结束时只调用一次(“$(function(){...});”
  4. 这将导致您的“ahitRate()”函数每5秒调用一次。

答案 1 :(得分:1)

setInterval保持触发 - 每次获得新响应时,都会启动一个新计时器。所以在五秒钟后,第一个计时器启动并启动另一个计时器。然后十秒钟后,两个计时器开火,再开始两个。

我想你可以看到它的发展方向。

我认为您正在寻找setTimeout()方法,或者只是在成功函数之外启动间隔计时器,因此永远不会再次调用它。