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

JS - Getting alert multiple times while long polling on success?

本文关键字:长时间 成功 JS-      更新时间:2023-09-26

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

第二个问题是,我如何让这个javascript代码每30秒取消一次ajax调用,然后重新启动它?我把setInterval和.abort()放在那里,但没有运气,可能是放错了位置。

谢谢你的智慧和帮助!

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的内容,但我如何确保它只准备好一次,并在准备好后再做呢?

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

你能为此制作一个显示问题的jsFiddle吗?

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

我个人的建议是重构您的代码,以使用基于.done.fail.always的新JQueryAjax样式。

并且setTimeout应该写为setTimeout(waitForMsg,2000)。使用字符串参数可以评估该字符串,而不仅仅是调用函数,这会对性能造成影响(非常小,几乎不明显,但确实如此)。

由于成功函数中的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();
      }
    }
  })
}

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

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