Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS-在长时间轮询成功时多次收到警报?_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript JS-在长时间轮询成功时多次收到警报?

Javascript JS-在长时间轮询成功时多次收到警报?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在看一个关于如何进行长时间轮询的视频教程,看起来我已经完成了,但我有一个问题,出于某种原因,虽然我从服务器得到了一个响应,但我的警报显示了3-6次。我认为只有当我们得到一个回应时,“成功”才会发生一次 第二个问题是,如何让这个javascript代码每30秒取消一次ajax调用,然后重新启动它?我把setInterval和.abort()放在了那里,而实验中没有运气,可能是放置错误 谢谢你的智慧和帮助 var timestamp = null; var imp = null; var annk

我在看一个关于如何进行长时间轮询的视频教程,看起来我已经完成了,但我有一个问题,出于某种原因,虽然我从服务器得到了一个响应,但我的警报显示了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秒后重新安排

你能为这个问题做一个JSFIDLE吗

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

我个人的建议是重构代码,使用新的jqueryajax风格,基于
.done
.fail
。始终


setTimeout应该写成
setTimeout(waitForMsg,2000)
。使用string参数,您可以计算该字符串,而不仅仅是调用函数,这是一种性能损失(很小,很难察觉,但确实如此)。

由于success函数中的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调用失败,您将强制中止循环


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

谢谢您的提示,我已将setTimeout更改为您显示的方法,但不带撇号。代码和我发布的一模一样,但是由于某种原因,今天早上我醒来,它不再这么做了。。我将研究.done、.fail和.始终是现在,我还没有看到这些。谢谢。谢谢,第二种方法是最好的,也很容易使用。现在一切正常。