dart 关于涉及定时器的非活动Tab限制的见解

wbgh16ku  于 2023-10-13  发布在  其他
关注(0)|答案(2)|浏览(99)

我正在构建一个Web应用程序,我们有一个会话长度的定义,当用户超过长度时,我们必须向用户显示超时弹出窗口。
目前,我有一个周期性的计时器,它每秒运行一次,检查会话的剩余时间,当它达到所需的值时,就会执行回调。然而,最近了解了Inactive Tab throttling场景,其中计时器的运行是不确定的,并且可能根本不为后台的选项卡运行。
问:一旦窗口重新成为焦点,计时器会再次运行吗?或者一旦挂起,计时器不会再次恢复?
如果计时器再次运行,它将从什么时候开始运行?tick事件是在队列中缓冲,还是在选项卡处于后台时根本不抛出。
这方面的任何文件都将非常有帮助。
我试着用各种方法重现这一过程,但结果都是不确定的。

hlswsv35

hlswsv351#

setTimeoutsetInterval在非活动选项卡中被限制,但在激活选项卡时正常恢复。使用日期查找超时:

const start = new Date, today = new Date;
today.setHours(0, 0, 0, 0);

const timer = () => setTimeout(() => {
  if(new Date - start > 10000){
    console.log('timeout!');
    return;
  }
  timer();
}, 1000);

timer();
console.log('started');

另外,当一个活动的标签发生超时时,你可以立即通过localStorageBroadcastChannel向不活动的标签发送一条消息,这样不活动的标签就可以停止它们的计时器。

fgw7neuy

fgw7neuy2#

当涉及到在后台处理计时器事件时,许多浏览器倾向于在选项卡空闲或在后台时限制或完全挂起计时器的执行,以保存系统资源。因此,在此期间可能会错过计时器事件。有关此行为的特定文档可能因浏览器而异,并且可能会随新版本而更改。要获得有关特定浏览器中计时器行为的更详细信息,我建议您查阅浏览器的官方文档或在Web上查找该特定浏览器和版本的特定资源。
此外,要在特定情况下管理后台计时器的行为,您可以考虑使用Web Workers等功能,这些功能允许您在单独的线程上在后台运行JavaScript代码,并且不受浏览器主选项卡计时器管理的影响。
在这里,您可以找到有关Web Workers的更多信息:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers

相关问题