Javascript JSON数据if/else解析

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

我正在做一些长轮询(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 
我不知道如何修复“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)