如果我递归调用ajax函数会发生什么?它可能会导致任何问题。

时间:2012-06-07 18:11:07

标签: ajax jquery

<script>
    $(document).ready(function(){
        ajaxcall();
    });
    function ajaxcall(){
    $.ajax({
          url: 'test.php',
            success: function(data) { 
                data = data.split(':');
                $('#hours').html(data[0]);
                $('#minutes').html(data[1]);
                $('#seconds').html(data[2]);
                ajaxcall();
            }
        });
    }
    </script>
    <span id="hours">0</span>:<span id="minutes">0</span>:<span id="seconds">0</span>

在这段代码中我调用了ajax函数onsuccess,因此它将是无限循环。它会导致任何问题吗?

2 个答案:

答案 0 :(得分:2)

这会导致浏览器最终耗尽内存并崩溃,因为每次调用都会保存在调用堆栈中。我错了;回调是异步的,因此控制将离开父函数。如果您正在尝试更新时间,我建议您执行以下操作:

$(document).ready(function(){
    setInterval(ajaxcall, 1000); //calls ajaxcall every 1000 microseconds
});

function ajaxcall(){
   $.ajax({
        url: 'test.php',
        success: function(data) { 
            data = data.split(':');
            $('#hours').html(data[0]);
            $('#minutes').html(data[1]);
            $('#seconds').html(data[2]);
        }
   });
}

答案 1 :(得分:1)

没有什么不好的事情会发生。它将进行ajax调用,等待它返回,然后永久地再创建一个。这本身并没有错。请注意,您的服务器端操作不是太重,并且您没有传输太多数据而不是浪费太多带宽。

如果您希望能够停止它,您可以创建一个变量来定义是否继续进行调用,并在任何时候关闭它。

var keepCalling = true;

function ajaxCall() {
    if (!keepCalling)
        return;

    //ajax call...
}

keepCalling设置为false将在当前呼叫完成后停止呼叫。