Search code examples
javascriptjqueryajaxlong-polling

JSON data if/else parse


I am doing some long polling (ajax) and I am looping the following portion of code.. There is code being executed above and below. This code is part of an internal messaging system. A certain portion of the page wil blink when a message arrives. If the user checks the message, it will remove the dash_notify from the JSON response, which needs to turn off the blinking. See below:

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

The following JSON response that gets sent to this code is:

{"current_date_time":"January 8, 2013 - 4:02 pm","dash_notify":"1"}

It understand the initial blink IF the above data gets passed. If the following gets passed:

{"current_date_time":"January 8, 2013 - 4:02 pm"}

Then it throws an error:

Uncaught ReferenceError: timer is not defined 

I cannot figure out how to fix the "else" portion working properly. If the code is initiated when the full dash_notify:1 response is sent, it works perfect. The button will blink, then if the user checks the message, it will no longer send dash_notify:1 and the button stops blinking. But if the code is initiated when dash_notify:1 is NOT set, it doesn't know what to do with the ClearInterval.

Basically I need the else portion fixed.

I have tried using different typeOf === undefined snippets, but it doesn't work.

Any help is appreciated.

Thank you!

EDIT:

This is currently working.. Timer is now defined above the statement

if(data.dash_notify == '1'){

                            var x = '#dash_notif_blink';

                        console.log("initiate_dash");
                        blinking($(x));

                        }else if (typeof timer != "undefined" && timer) { 
                            clearInterval(timer);
    }               
                    }

This is working, but sometimes it trys to kill the timer but it doesn't actually do it. This happens every so often.


Solution

  • This is now working beautifully. *Thank you to everyone who helped!*

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