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