Javascript JSON数据if/else解析
我正在做一些长轮询(ajax),并循环下面的代码部分。。有代码在上面和下面执行。此代码是内部消息传递系统的一部分。当消息到达时,页面的某一部分将闪烁。如果用户检查消息,它将从JSON响应中删除dash_notify,这需要关闭闪烁。见下文:Javascript JSON数据if/else解析,javascript,jquery,ajax,long-polling,Javascript,Jquery,Ajax,Long Polling,我正在做一些长轮询(ajax),并循环下面的代码部分。。有代码在上面和下面执行。此代码是内部消息传递系统的一部分。当消息到达时,页面的某一部分将闪烁。如果用户检查消息,它将从JSON响应中删除dash_notify,这需要关闭闪烁。见下文: if (data.dash_notify == '1') { var x = '#dash_notif_blink'; function blinking(x) { timer = setInterval(blink, 10
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
我不知道如何修复“else”部分正常工作。如果在发送完整的dash_notify:1响应时启动该代码,则该代码工作正常。该按钮将闪烁,然后如果用户检查消息,它将不再发送dash_notify:1,并且该按钮停止闪烁。但如果代码是在未设置dash_notify:1时启动的,则它不知道如何处理ClearInterval
基本上,我需要修复else部分
我尝试过使用不同的typeOf==未定义的代码段,但不起作用
感谢您的帮助
谢谢大家!
编辑:
这项工作目前正在进行中。。现在在语句上方定义了计时器
if(data.dash_notify == '1'){
var x = '#dash_notif_blink';
console.log("initiate_dash");
blinking($(x));
}else if (typeof timer != "undefined" && timer) {
clearInterval(timer);
}
}
这是可行的,但有时它试图杀死计时器,但实际上它没有这样做。这种情况经常发生。不确定您的支票类型有何错误,因为您没有实际显示整个代码,但它应该如下所示:
if (typeof timer != "undefined" && timer) {
clearInterval(timer);
}
不确定您的检查类型有何错误,因为您没有实际显示整个代码,但它应该如下所示:
if (typeof timer != "undefined" && timer) {
clearInterval(timer);
}
在进入检查程序(循环?)之前,基本上定义变量<代码>计时器代码>: 您可以调用
clearInterval(无论什么)
。即使无论什么
为空
,未定义
,字符串等等。只需确保计时器
存在即可
将无效ID传递给clearTimeout没有任何效果(以及
不会引发异常)。(MDN)
在进入检查程序(循环?)之前,基本上定义变量<代码>计时器代码>: 您可以调用
clearInterval(无论什么)
。即使无论什么
为空
,未定义
,字符串等等。只需确保计时器
存在即可
将无效ID传递给clearTimeout没有任何效果(以及
不会引发异常)。(MDN)
之所以出现此错误,是因为
计时器
仅在闪烁
函数中声明/初始化。在您调用clearInterval(timer)
的地方,timer
不存在。您会收到该错误,因为timer
仅在闪烁
函数中声明/初始化。在您调用clearInterval(timer)
的地方,timer
不存在。看起来它不起作用,因为timer
不存在于内部闪烁
功能之外。我在这里假设您没有var定时器
在闪烁
功能之外的某个位置,这很可能是由于您遇到的错误
发生这种情况的原因:
如果我是对的,并且您没有在代码中的任何其他地方声明timer
,那么var timer
将被隐式添加到闪烁
函数的开头:
function blinking(x) {
var timer;
timer = setInterval(blink, 10);
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
}
这使得定时器
成为内闪烁的局部变量。因为您从未将其从闭包中传递出去,所以一旦您超出了该函数,它就不存在了。因此,您需要将计时器
拉入外部上下文(选项1)或从内部闪烁
(选项2)使其可用
怎么办:
如果您想访问该闭包之外的计时器
,则必须执行以下两项操作之一:
1:声明计时器
在闪烁
之外:
var timer = null;
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
//etc...
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);
}
2:使其成为闪烁的的返回值
:
var timer = null;
if (data.dash_notify == '1') {
var x = '#dash_notif_blink';
function blinking(x) {
//etc...
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);
}
这两种方法中的任何一种都可以工作,并且在污染外部名称空间方面或多或少是相同的。我更喜欢选项2,因为我觉得在需要返回局部变量之前,使用局部变量更容易
编辑:
您的评论说循环无限运行,这意味着您正在创建一个全新的间隔,并每次重新分配计时器变量。这是一个与我上面描述的问题不同的问题。旧的间隔仍然存在,计时器
不再指向它。那么清除间隔(计时器)
如何清除所有这些间隔呢?它不能,它只能清除最近的一个
基本上,你有一大堆计时器都在试图让它同时闪烁
你如何处理这件事取决于你想做什么。最简单的方法是一次运行不超过一个时间间隔,这意味着您每次都必须清除计时器
//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);
});
}
看起来它不起作用了,因为定时器
不存在于内部的闪烁
功能之外。我在这里假设您没有var定时器
在闪烁
功能之外的某个位置,这很可能是由于您遇到的错误
发生这种情况的原因:
如果我是对的,并且您没有在代码中的任何其他地方声明timer
,那么var timer
将被隐式添加到闪烁
函数的开头:
function blinking(x) {
var timer;
timer = setInterval(blink, 10);
function blink() {
x.fadeOut(400, function () {
x.fadeIn(400);
});
}
}
这使得定时器
成为内闪烁的局部变量。因为您从未将其从闭包中传递出去,所以一旦您超出了该函数,它就不存在了。因此,您需要将计时器
拉入外部上下文(选项1)