我正在关注如何进行长轮询的视频教程,看起来我已经完成了,但我遇到了一个问题,出于某种原因,虽然我从服务器得到一个响应,但我的警报显示为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的内容,但是我如何确保它只准备一次并在它准备好之后再做它?
答案 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调用失败,使用这种方法,你将强制中止循环。
您还可以取消或更改超时时间,具体取决于您的服务使用情况,以确保网络资源的合理性。