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