0

我正在关注有关如何进行长轮询的视频教程,似乎我已经完成了,但是由于某种原因,我遇到了一个问题,尽管我从服务器收到了一个响应,但我的警报显示了 3-6 次。我认为如果我们得到一个回应,“成功”只会发生一次。

第二个问题是,如何让这个 javascript 代码每 30 秒取消一次 ajax 调用,然后重新启动它?我已经在其中放入了带有 .abort() 的 setInterval,同时尝试了没有运气,可能是错误的位置。

感谢您的智慧和帮助!

var timestamp = null;
var imp = null;
var annk = null;
function waitForMsg(){
    $.ajax( 
    {  
        type: "GET",  
        url: "/test?timestamp=" + timestamp + "&imp=" +imp + "&annk=" +annk,
        dataType : 'json',  
        async: true,
        cache: false,
        success: function(data) 
        {
                            alert("hello");
                if(data.annkr > "0"){
                    $("#myidone").css("background-color", "#cccccc");
                }else{
                    $("#myidone").css("background-color", "#cccccc");
                }
                if(data.impr > 0){
                    $("#myidtwo").css("background-color", "#000000");
                }else{
                    $("#myidtwo").css("background-color", "#000000");
                }
            annk = data.annkr;
            imp = data.impr;
            timestamp = data.timestamp;
            setTimeout('waitForMsg()',2000);    
        }
    });
}   

$(document).ready(function(){
    waitForMsg();
});

我在 Stackoverflow 上阅读了有关 readystates 的内容,但是我如何确保它只准备好一次并在准备好之后再做呢?

4

3 回答 3

1

如果代码正是您发布的代码,则没有理由显示警报超过 1 秒,然后在 2 秒后重新安排。

你可以为显示问题制作一个 jsFiddle 吗?

第二个问题更有趣。您可以timeout在调用中使用该选项,.ajax然后在错误处理程序中重新安排调用。

我个人的建议是重构您的代码以使用基于.done .fail.always.

而那个 setTimeout 应该写成setTimeout(waitForMsg,2000). 使用 string 参数,您可以评估该字符串,而不仅仅是调用函数,这是一种性能损失(小到几乎不引人注意,但就是这样)。

于 2013-08-22T17:01:53.560 回答
0

实际上,您应该使用 setInterval 而不是 setTimeout,如果您的 ajax 调用失败,则使用这种方法,您将强制中止循环。

您还可以根据服务的使用情况取消或更改超时时间,以确保网络资源健全。

于 2013-08-22T17:10:35.390 回答
0

由于成功函数中的 setTimeout(),您可能会多次看到警报,您会继续调用 waitForMsg() 函数。只是一个猜测。

要中止请求,您可以执行以下操作:

var timer = null;
function waitForMessage() {
  var req = $.ajax(YOUR_CODE);

  // The 30 second timeout
  timer = setTimeout(function() {
    req.abort();
    waitForMessage();
  }, 30000);
}

或者稍微好一点:

function waitForMsg() {
  $.ajax({
    timeout: 30000,
    error: function(err) {
      if(err === 'timeout') {
        waitForMsg();
      }
    }
  })
}
于 2013-08-22T17:08:36.617 回答