JS-在长时间轮询成功时多次获得警报
JS - Getting alert multiple times while long polling on success?
我正在观看一个关于如何进行长轮询的视频教程,似乎我已经完成了,但我有一个问题,由于某种原因,尽管我从服务器收到了一个响应,但我的警报显示了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调用失败,您将强制中止循环。
您也可以根据网络资源健全性服务的使用情况取消或更改超时时间。
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 谷歌地图需要很长时间才能在ie11中渲染
- 有没有一种方法可以检查javascript以毫秒为单位执行一个函数需要多长时间
- 我一直收到的控制台警告是什么?推迟长时间运行的计时器任务以提高滚动的流畅性
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- 如何在长时间执行JavaScript期间显示微调器
- 长时间轮询:每个浏览器中的通知
- 完整日历:如何支持一次点击和不长时间点击
- 如何使用 javascript 停止对 asp.net 进行正在进行的回发(长时间运行的执行)
- 为什么这个 AJAX 调用需要这么长时间
- 为什么这个正则表达式需要这么长时间才能执行
- 如何修复长时间运行的脚本
- Node.js中的垃圾收集作用域-变量将保持设置状态多长时间
- javascript秒表限制最长时间
- 长时间运行的脚本IE与Chrome/Firefox
- 有没有一种方法可以在长时间运行的JavaScript操作之前强制回流
- 我的无引用 JavaScript 对象存在在哪里以及存在多长时间
- 为什么chromecast在动画帧之间需要这么长时间
- 输入焦点关闭键盘,需要长时间触摸
- JS-在长时间轮询成功时多次获得警报