Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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
Javascript定时通知-setTimeout、setInterval_Javascript_Performance_Settimeout_Reminders - Fatal编程技术网

Javascript定时通知-setTimeout、setInterval

Javascript定时通知-setTimeout、setInterval,javascript,performance,settimeout,reminders,Javascript,Performance,Settimeout,Reminders,我正在创建一个允许用户管理日历(CRUD事件、任务、提醒等)的web应用程序 我正在尝试实现一个功能,在活动/任务开始前x分钟,他们将收到一个弹出提醒。据我所知,使用javascript实现这一点的方法只有一种: 登录时,检查数据库中任何即将发生的事件(例如在接下来的12小时内),并为下一个事件创建setTimeout,当该setTimeout执行时,再次检查下一个事件,依此类推 我的问题是,在用户交互期间在后台运行多个设置超时(10+)是否会降低我的应用程序的性能 有没有更好的方法在客户端处理

我正在创建一个允许用户管理日历(CRUD事件、任务、提醒等)的web应用程序

我正在尝试实现一个功能,在活动/任务开始前x分钟,他们将收到一个弹出提醒。据我所知,使用javascript实现这一点的方法只有一种:

登录时,检查数据库中任何即将发生的事件(例如在接下来的12小时内),并为下一个事件创建
setTimeout
,当该
setTimeout
执行时,再次检查下一个事件,依此类推

我的问题是,在用户交互期间在后台运行多个设置超时(10+)是否会降低我的应用程序的性能

有没有更好的方法在客户端处理弹出式通知?推送通知?如有任何建议,将不胜感激

我的问题是,在用户交互期间在后台运行多个设置超时(10+)是否会降低我的应用程序的性能

在这些数字中,没有。(取决于
+
+
的方式,
10+
中的
+
是什么。我的意思是,我预计一百万可能是个问题。)

另一种方法是使用单个计时器(例如,每分钟)来检查应在该分钟发生的通知。例如:

function notifyForThisMinute() {
    // Notify user of things we should notify them of as of this minute
    // ...

    // Schedule next check for beginning of next minute; always wait
    // until we're a second into the minute to make the checks easier
    setTimeout(notifyForThisMinute, (61 - new Date().getSeconds()) * 1000);
}
notifyForThisMinute(); // First call starts process

这取决于浏览器(或者更具体地说,它是javascript引擎)甚至是操作系统

并分析了计时器

更值得注意的一点是计时器在给定时间间隔内运行的频率(比如每200ms或每10分钟运行一次)

托马斯:

使用低频定时器(延时为1秒或更长时间的定时器),我们可以在不显著降低性能的情况下在[Android G1或iPhone 3G]上创建许多定时器。即使预定了100个计时器,我们的应用程序的响应性也没有明显降低。然而,对于高频定时器,情况恰恰相反。每隔100-200毫秒触发几个计时器就足以让我们的UI感觉迟钝

托马斯:

请记住,此代码将每秒执行多次。在已注册回调数组上循环可能会稍微“干净”一些,但该函数必须尽快执行。通过对函数调用进行硬编码,可以很容易地跟踪计时器中正在完成的所有工作

重新调整:

一旦您开始进入64-128个同步计时器的范围,您在大多数浏览器中都会非常倒霉


你也可以看看

为什么你要在后台运行10+呢?正如您所说,为下一个事件设置超时。当它启动时,检查下一个事件并设置一个新的计时器。这是一个非常复杂的应用程序,我在很多事情上使用定时通知。事件提醒是目前为止最重要的…我真的不认为我自己有超过10个,我只是用它作为上限OK,我想你的意思可能是一次为多个事件设置一个超时,这是不必要的。听起来很合理。是的,我也想到了这种方法,但是如果那天没有活动的话,这不会给服务器打很多不必要的电话吗?…我真的看不到有超过10次的情况,这只是我的上限limit@A.O.:我没说是服务器呼叫。:-)您可以在接下来的X分钟内加载信息,并在本地保存。这一点很好…性能方面,它将与您的相同,不是吗?一个长时间运行的setTimeout与一系列连续较短的setTimeout相比?@a.O:我想这取决于在同一分钟内会发生多少个通知,在相关浏览器上执行
setTimeout
,检查需要通知的内容的执行情况。。。在一天结束时,我真的不认为这有什么关系,但我倾向于使用一个计时器来检查那一分钟到期的所有内容,即使只是UI方面(一个列表,而不是几个不同的东西)。我的意思是,即使您有一个1000长的列表,检查一下每分钟一次也不会导致任何性能问题。谢谢您的建议/保证+1我只是想补充一点,这里引用的两篇文章都很老(例如John的文章已经7岁了),而且此后所有浏览器中的计时器都有所改进,所以这个答案中的信息并不完全正确。