我正在做一些长轮询(ajax),我正在循环以下代码部分..上面和下面都有代码执行。此代码是内部邮件系统的一部分。当消息到达时,页面的某一部分将闪烁。如果用户检查消息,它将从JSON响应中删除dash_notify,这需要关闭闪烁。见下文:
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
timer = setInterval(blink, 10);
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
}
console.log("initiate_dash");
blinking($(x));
} else if (!data.dash_notify) {
console.log("good");
clearInterval(timer);
}
以下发送到此代码的JSON响应是:
{"current_date_time":"January 8, 2013 - 4:02 pm","dash_notify":"1"}
如果上述数据通过,它会理解初始闪烁。如果以下内容通过:
{"current_date_time":"January 8, 2013 - 4:02 pm"}
然后它会抛出一个错误:
Uncaught ReferenceError: timer is not defined
我无法弄清楚如何修复“其他”部分正常工作。如果在发送完整的dash_notify:1响应时启动代码,则它完美无缺。按钮将闪烁,然后如果用户检查消息,它将不再发送dash_notify:1并且按钮停止闪烁。但是如果在未设置dash_notify:1时启动代码,则它不知道如何处理ClearInterval。
基本上我需要修复其他部分。
我尝试过使用不同的typeOf === undefined snippets,但它不起作用。
感谢任何帮助。
谢谢!
修改
目前正在使用..定时器现在定义在语句
之上if(data.dash_notify == '1'){
var x = '#dash_notif_blink';
console.log("initiate_dash");
blinking($(x));
}else if (typeof timer != "undefined" && timer) {
clearInterval(timer);
}
}
这是有效的,但有时它试图杀死计时器,但它实际上并没有这样做。这种情况经常发生。
答案 0 :(得分:3)
看起来它不起作用,因为timer
在您的内部blinking
函数之外不存在。我在这里假设你在var timer;
函数之外的某个地方没有blinking
,这很可能是你得到的错误。
如果我是对的,并且您没有在代码中的任何其他地方声明timer
,那么var timer
会隐式添加到blinking
函数的开头:
function blinking(x) {
var timer;
timer = setInterval(blink, 10);
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
}
这使timer
成为blinking
内的局部变量。因为你永远不会将它从闭包中传出,所以当你在函数之外时它就不存在了。因此,您需要将timer
拉入外部上下文(选项1)或从blinking
内部使用(选项2)。
如果您希望在该关闭之外访问timer
,则必须执行以下两项操作之一:
1:在timer
之外声明blinking
:
var timer = null;
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
//etc...
2:将其设为blinking
的返回值:
var t;
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
var timer = setInterval(blink, 10); //note the var keyword for best practice
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
return timer;
}
console.log("initiate_dash");
t = blinking($(x));
} else if (!data.dash_notify) {
console.log("good");
clearInterval(t);
}
其中任何一个都可以工作,并且在污染外部命名空间方面或多或少相同。我更喜欢Option 2,因为我觉得在你需要返回之前使用局部变量更容易。
你的评论说循环无限运行,这意味着你每次创建一个全新的间隔并重新分配timer
变量。这与我上面描述的问题是一个单独的问题。旧的间隔仍在那里,timer
只是不再指向它了。那么clearInterval(timer)
如何清除所有这些间隔?它不能,它只能清除最新的一个。
基本上,你有很多计时器试图让这个东西一下子闪烁。
你如何处理这取决于你想要做什么。最简单的方法是一次运行不超过一个间隔,这意味着每次都必须清除timer
。
//same as option 1 above except for `clearInterval(timer)` at the
//beginning of `blinking`
var timer = null;
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
clearInterval(timer);
timer = setInterval(blink, 10);
如果您需要运行多个计时器,则必须在数组或其他内容中跟踪它们:
var timers = [];
//...
function blinking(x) {
timers.push(setInterval(blink, 10));
//...
} else if (!data.dash_notify) {
timers.forEach(function(timer) {
clearInterval(timer);
});
}
答案 1 :(得分:0)
由于您实际上并没有显示整个代码,因此不确定您的类型检查是否出错了,但它看起来应该是这样的:
if (typeof timer != "undefined" && timer) {
clearInterval(timer);
}
答案 2 :(得分:0)
在输入检查程序(循环?)之前,基本上定义变量timer
:
var timer;
... some code ...
if ( data.dash_notify && data.dash_notify == '1') {
...
} else if (!data.dash_notify) {
clearInterval(timer);
}
您可以致电clearInterval( whatever )
without any consequences。即使whatever
是null
,undefined
,字符串等等。只需确保timer
存在。
将无效ID传递给clearTimeout没有任何影响(和 不会抛出异常)。 (MDN)
答案 3 :(得分:0)
您收到该错误是因为timer
仅在blinking
函数中声明/初始化。在您致电clearInterval(timer)
的地方,timer
不存在。
答案 4 :(得分:0)
现在效果很好。 * 感谢所有帮助过的人! *
if(data.dash_notify ==='1'&& t === null){
var x = '#dash_notif_blink';
function blinking(x) {
var timer = setInterval(blink, 10); //note the var keyword for best practice
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
return timer;
}
console.log('initiate_dash_alert');
// Data is passed. Parse to see if dash alert should be called. Secondary protection for
// multiple timer creation.
if(t){return;}else{t = blinking($(x));}
}else if (!data.dash_notify){
clearInterval(t);
console.log('clear_dash_alert');
t = null;
}else{
console.log(t);
console.log('no_push_events');
}