JavaScript定时通知 - setTimeout,setInterval

4
我正在创建一个Web应用程序,让用户可以管理日历(CRUD事件、任务、提醒等)。
我正在尝试实现一项功能,即在事件/任务开始x分钟前接收弹出式提醒。据我所知,使用JavaScript只有一种方法可以实现这一点:
在登录时,检查数据库中的所有即将到来的事件(例如在接下来的12小时内),并为下一个事件创建一个setTimeout,当该setTimeout执行时,再次检查下一个事件,以此类推...。
我的问题是,后台运行多个setTimeout(10+)是否会降低应用程序的性能?
在客户端处理弹出式通知的更好方法是什么? 推送通知? 欢迎提出任何建议!

为什么你要在后台运行10个以上的进程?正如你所说,设置下一个事件的超时时间。当它触发时,检查下一个事件并设置新的定时器。 - crad
这是一个非常复杂的应用程序,我使用定时通知来完成很多事情。尽管如此,事件提醒是最重要的......而且我真的不认为我会拥有超过10个,我只是将其作为上限。 - A.O.
1
好的,我以为你可能是指一次为多个事件设置超时,这是不必要的。听起来很合理。 - crad
2个回答

4
我的问题是,当用户进行交互时,在后台运行多个setTimeout(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

是的,我也考虑过那种方法,但如果那天没有事件,那不会对服务器产生很多不必要的调用吗?...而且我真的看不出来会有超过10个的情况,那可能是我的上限。 - A.O.
@A.O.:我没有说这是服务器调用。 :-) 您可以加载接下来 X 分钟的信息并在本地使用它。 - T.J. Crowder
好的观点...就性能而言,一个长时间运行的setTimeout和一堆连续的较短的setTimeout相比,它们的性能应该是相同的,不是吗? - A.O.
@A.O.:我想这取决于同一分钟内会有多少通知、浏览器中setTimeout的实现方式以及你检查需要通知的事物的实现方式……归根结底,我真的不认为这会有什么影响,但从UI方面来看,我更倾向于使用单个计时器来检查该分钟内所有到期的内容(而不是几个不同的内容)。我的意思是,即使你有一个1,000项的列表,每分钟检查一次也不会导致任何性能问题。 - T.J. Crowder
谢谢您的建议/保证!+1 - A.O.

4
这取决于浏览器(或更具体地说,它的JavaScript引擎),甚至操作系统。

Neil Thomas(在GMAIL移动版工作时)John Resig分析了计时器。

需要注意的一点是,在给定的时间间隔内计时器运行的频率有多高(例如每200毫秒一次或每10分钟一次...)。

Thomas:

对于低频计时器 - 延迟为一秒或更长时间的计时器 - 我们可以创建许多计时器,而不会显着降低[Android G1或iPhone 3G]的性能。即使预定了100个计时器,我们的应用程序也没有明显变得不响应。然而,对于高频计时器,情况正好相反。几个每100-200毫秒触发的计时器就足以使我们的用户界面感到迟缓。

Thomas:

请记住,这段代码将每秒执行多次。循环遍历已注册回调函数的数组可能会使代码略微“更清晰”,但是关键是该函数尽可能快地执行。硬编码函数调用还可以轻松跟踪定时器内完成的所有工作。
Resig:
一旦您开始进入64-128个同时计时器的范围,大多数浏览器基本上都无法使用。
也可以查看Chronos

1
我只想补充一下,这里引用的两篇文章都相当古老(例如John的文章已经有7年了),而且自那时以来,所有浏览器中的计时器都得到了改进,因此本答案中的信息并不完全正确。 - YemSalat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接