JS - 在长时间轮询成功的同时多次获得警报?

时间:2013-08-22 16:55:10

标签: javascript jquery ajax

我正在关注如何进行长轮询的视频教程,看起来我已经完成了,但我遇到了一个问题,出于某种原因,虽然我从服务器得到一个响应,但我的警报显示为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的内容,但是我如何确保它只准备一次并在它准备好之后再做它?

3 个答案:

答案 0 :(得分:1)

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

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

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

我个人的建议是重构您的代码,以便在.done .fail.always上使用新的JQuery Ajax样式库。

该setTimeout应写为setTimeout(waitForMsg,2000)。使用字符串参数,您可以评估该字符串,而不是仅仅调用该函数,这是一个性能损失(这么小,几乎没有注意到,但那是)。

答案 1 :(得分: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();
      }
    }
  })
}

答案 2 :(得分:0)

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

您还可以取消或更改超时时间,具体取决于您的服务使用情况,以确保网络资源的合理性。