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

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

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

 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 += '

' + messages[i]['date'] + ': ' + messages[i]['message'] + '

'; } html += '' + name + ': ' + length + ' new ' + grammar + ''; html += '

' + name + '

' + msgs + '
'; html += '
'; }); /** 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', '

You have ' + total + ' new ' + grammar2 + '. Click here to view new ' + grammar2 + '

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

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

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

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