如果/ else解析JSON数据

时间:2013-01-08 21:22:08

标签: 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);

        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);
    }               
                    }

这是有效的,但有时它试图杀死计时器,但它实际上并没有这样做。这种情况经常发生。

5 个答案:

答案 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。即使whatevernullundefined,字符串等等。只需确保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');

                }