如何在不经常通知用户的情况下使用setInterval不断检查新消息?

时间:2012-05-15 12:07:55

标签: jquery ajax setinterval

我有一个jQuery AJAX函数,我检查新消息,如果有,我向用户显示他们有新消息的通知。我的函数是getNewMessage();,现在它可以完美地用于页面刷新,因为一切都发生了一次。但是,当我把它放在setInterval("getNewMessage()", 20000)中时,我会收到无限循环的通知。这是可以理解的但是如何阻止它每次都通知用户但同时不断检查新消息?

这是我的getMessage函数,对不起大功能:

function getNewMessage()
{
    /** Retrieve new messages **/
    $.post('',  { newMessage : true}, function(data)
    {      
        data = $.parseJSON(data);

        /** If new messages exist then display  notification and popup **/
        if(data)
        {

            var newMessageDialog = $('#newMessageDialog');

            /** Create popup dialog options **/
            newMessageDialog.dialog(
            {
                autoOpen: false,
                modal: true,
                minWidth: '100',
                width: '800',
                hide: 'fold',
                show: 'drop',
                title: "New Messages",   
                close: function()
                {
                    hideAllNotifications();
                } 
            });

            /** Initialise variables **/
            var html = '';
            var length = 0;
            var total = 0;

            /** For each message we create the html for the message and insert into dialog **/
            $.each(data, function(name, messages)
            {
                length = messages.length;
                total += length;
                /** For grammatical reasons. If length > 1 then "message" is plural**/
                grammar = (length > 1) ? "messages" : "message";

                /** Reverse the messages so the latest message appears at top and earliest message at bottom **/
                messages.reverse();

                var msgs = '';
                for(var i in messages)
                {
                    msgs += '<p>' + messages[i]['date'] + ': ' + messages[i]['message'] + '</p>';
                }

                html += '<a href="uid[' + messages[i]['uid'] + ']" class="popUpLink">' + name + ': ' + length + ' new ' + grammar + '</a>';
                html += '<div class="popUpDialog" id="viewNewMessageDialog" title="New messages from ' + name + '"><div class="flexi_box"><h3 class="hubHeader">' + name + '</h3>' + msgs + '</div></div>';
                html += '</br>';
            });

            /** Insert Content **/
            $('.flexi_box h3', newMessageDialog).after(html);

            /** Bind dialog to popuplinks **/
            popUpDialogs();

            /** Bind click event
             *  If clicked then we assume message has been read so we delete from messages table **/
            $('a.popUpLink', newMessageDialog).on('click', function()
            {
                /** Get userid from href **/
                var uid = $(this).attr('href');
                var start = uid.indexOf('[');
                var end = uid.indexOf(']');
                uid = uid.slice(start + 1, end);
                removeReadMessages(uid);
            });

            var grammar2 = (total > 1) ? 'messages': 'message'
            var notifier = showNotification('info', '<h3>You have ' + total + ' new ' + grammar2 + '. Click here to view new ' + grammar2 + '</h3>');

            /** Open dialog on click **/
            $('.info').on('click', function()
            {               
                /** Trigger Dialog **/
                $('#newMessageDialog').dialog('open').css('maxHeight', $(window).height()-90);
            });

            return true;
        }
    });//end post   
}

3 个答案:

答案 0 :(得分:3)

您应该调用setInterval来运行一次功能,而不是致电setTimeout。 然后,在您的AJAX回调中,如果您没有收到消息,请再次致电setTimeout

答案 1 :(得分:0)

检测您是否收到了与上一封邮件不同的新邮件。只有当有新消息时,才显示对话框。

答案 2 :(得分:0)

创建一个全局变量 - 一个数组 - 每当您显示通知时,都会在其中存储messages[i]['uid']。然后,当您再次检查时,排除阵列中已有的任何内容。