使用jquery在基于ajax的轮询中使用setTimeout的问题

时间:2009-12-06 11:34:05

标签: javascript jquery

在我的代码中,我需要使用ajax每5秒后轮询一个url。 URL返回json响应。下面是我在$(document).ready中编写的代码。但是,setTimeout()函数不起作用。收到响应后立即调用startPoll()函数。我希望在收到响应后暂停5秒钟,然后再次调用startPoll函数。有什么方法可以解决这个问题吗?

$(document).ready(function(){


   var startPoll = function() {
         $.post('<url>', {},onPollRequestComplete, 'json');

   }

   var onPollRequestComplete = function(response) {

        responseObject = eval(response);

        if(responseObject.success) {
            //Do something here
        }

        setTimeout(startPoll(),5000); /*Make next polling request after 5 seconds*/         

}

startPoll();

});

谢谢

2 个答案:

答案 0 :(得分:5)

这是你的问题:

setTimeout(startPoll(),5000);

你立刻打电话给startPoll,而不是5秒后。相反,你应该传递函数引用,如下所示:

setTimeout(startPoll,5000);

如果您希望轮询每5秒触发一次,即使之前的民意调查不起作用(遇到服务器错误),也应该使用setInterval代替。如果您希望能够在出现错误时停止轮询,那么您现在拥有的代码非常棒。

答案 1 :(得分:1)

我认为你需要使用setInterval

而不是setTimeout
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            var startPoll = function() {
                $.post('url', {}, function(response) {
                    var responseObject = eval(response);

                    if (responseObject.success) {
                        alert('hi');
                    }
                }, 'json');
            }

            setInterval(startPoll, 5000); /*Make next polling request after 5 seconds*/

        });
    </script>
</head>
<body>
</body>
</html>