Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery/javascript setInterval_Javascript_Jquery - Fatal编程技术网

jquery/javascript setInterval

jquery/javascript setInterval,javascript,jquery,Javascript,Jquery,目前,我正在开发一个用户通知警报消息功能 我设法使用setInterval来控制我的Ajax调用(检查是否有任何针对用户的通知消息)。但我的问题是,我只想要通知消息 在页面上出现一次(现在在屏幕上显示多个通知警报消息)。我知道您可以使用setTimeout使其只调用一次,但我还需要该页面检查每5分钟是否有新的通知消息警报 第二个问题是否可能是第一轮立即调用Ajax调用,然后每隔5分钟调用所有其他调用?因为我想让系统在他们登录system n后立即检查,然后每5分钟检查一次 这是我的密码 func

目前,我正在开发一个用户通知警报消息功能

我设法使用
setInterval
来控制我的Ajax调用(检查是否有任何针对用户的通知消息)。但我的问题是,我只想要通知消息 在页面上出现一次(现在在屏幕上显示多个通知警报消息)。我知道您可以使用
setTimeout
使其只调用一次,但我还需要该页面检查每5分钟是否有新的通知消息警报

第二个问题是否可能是第一轮立即调用Ajax调用,然后每隔5分钟调用所有其他调用?因为我想让系统在他们登录system n后立即检查,然后每5分钟检查一次

这是我的密码

function getAjaxNotice() {
    $.post("/async/getnotification", {},
        function(response) {
            var notice = $(response);
            $("#notices").prepend(notice);
        });

    return false;
}

setInterval("getAjaxNotice()", 50000);
有几件事

setInterval("getAjaxNotice()", 50000);
不是5分钟

5分钟=300000毫秒

5 minutes * 60 seconds * 1000 milliseconds = 300000ms
如果你想让它立即运行,然后每5分钟运行一次,你可以简单地这样做

$(document).ready(function() {
     getAjaxNotice();



        function getAjaxNotice() {
             $.post("/async/getnotification" , 
             {},                              
             function(response)
             {
                  var notice = $(response);
                  $("#notices").prepend(notice);
             });
             return false;                      
       } 

       setInterval( getAjaxNotice(), 300000 );

});

对于第一个问题,您应该存储来自
setInterval
的返回值,然后在收到警报时调用
clearInterval(myIntervalId)


对于第二个问题,您可以在车身装载期间调用一次
getAjaxNotice
,然后如果没有收到警报,则在该点调用
setInterval

setInterval
的时间以毫秒为单位

5 minutes * 60 seconds * 1000 milliseconds = 300000ms
另外,我建议您将函数传递给
setInterval
而不是字符串,这样可以避免隐式使用
eval

setInterval(getAjaxNotice, 300000);
要在页面开头调用
getAjaxNotice
,请将其放入
ready
块中

$(function(){
    getAjaxNotice();
});

首先,您应该将初始化代码包装在onLoad函数中:

$(document).ready(function() {
  // Put all your code here
});
只显示一次很简单,请使用.html()来设置内容,而不是添加内容:

$("#notices").html(notice);
第三,作为样式注释,不应将字符串传递给setInterval()。而是传递函数名:

setInterval( getAjaxNotice, 50000 );
最后,要使其立即调用函数,并在每5分钟后再次调用,请使用:

// Set the timer
setInterval( getAjaxNotice, 50000 );
// Call it once now
getAjaxNotice();

还要注意50000是50秒,而不是5分钟。5分钟等于5*60*1000=300000

在你的情况下,听起来你在处理一些问题。因此,使用当前的方法,您可以首先进行ajax调用,然后设置超时:

getAjaxNotice();
setTimeout( "getAjaxNotice()", 300000);
其次,如果您有某种类型的“消息确认”事件,确保用户只收到一次消息是很容易做到的。假设您的用户可以在多台计算机上打开浏览器,如果您让用户单击消息或单击“确定”按钮,或执行某些操作以确认他们收到了消息,您可以启动另一个ajax调用以从服务器上的缓冲区中删除该消息,但仍然在所有打开的浏览器上显示该消息。本地浏览器将只显示一次,因为如果消息重复,您可以阻止在客户端显示它(基于任何对您的应用程序有意义的标准)

但是,您应该研究长轮询和COMET。Comet是一个基于服务器端事件向web浏览器推送通知的概念,与web浏览器不断请求服务器更改相反

由于web框架和浏览器的限制,这是通过一些技术实现的,但长轮询似乎是最普遍的。HTML5和websockets正试图做出一些改变,这些改变可能会阻止同时进行轮询,但目前还没有现成的版本

meebo和facebook等公司已经使用了长轮询和基于COMET的体系结构。请不要引用我的话,但出于某种原因,我倾向于相信facebook使用基于Erlang的Web服务器来服务他们的聊天信息。Erlang和NodeJs只是两个解决方案,您可以使用它们构建轻量级的web服务器,这些服务器可以很好地处理大量长轮询请求


你绝对应该自己去阅读所有这些东西,因为有大量的信息可供利用。我已经在AmazonEC2上尝试过创建一个NodeJs服务器,因为我传统上是一个.NET工作,我不认为IIS是支持.NET应用程序的长轮询功能的正确解决方案,该应用程序使用长轮询,我不得不说我非常喜欢NodeJs。另外,javascript语言比我对Erlang的有限知识更为熟悉。

是的,我同意,在这种情况下,没有理由向setInterval传递字符串。除非有某种情有可原的情况,否则您应该尝试将函数传递给setInterval/setTimeout。我不确定当他们引入“严格模式”时,传递字符串是否有效,我认为严格模式不允许使用eval。是的,存储返回值肯定是好的。特别是当你需要在某个时刻取消计时器时。我不知道每次打电话后我是否会把它清除掉。这本质上与只调用setTimeout(functionX,timeoutPeriod)相同,然后在functionX内部调用setTimeout(functionX,timeoutPeriod)。因此,我会说,当你完成时,只需清除间隔。@Mark,我想我的帖子不清楚;我原本打算在收到警报时(而不是每次呼叫后)清除间隔。OP似乎希望在该点停止查询。