如何检测 EmberJS 中的一段时间不活动?

How to detect a period of inactivity in EmberJS?

我正在尝试检测我的 EmberJS 应用程序中用户不活动的时间段,以便在一段时间后我可以调用 session.inValidate 方法并撤销他们的身份验证。

我能找到的唯一资源是一篇文章 here which I was advised in an original question 已经过时并且不使用当前的 Ember 概念。

过时的文章建议将 属性 添加到 App 对象并在 mousemove 等某些事件上更新 属性 但我无法做到在 app.js 或配置环境中找到正确设置此 属性 的位置。

ember-concurrency 被推荐,但在查看了一些文档后,我仍然不明白此类代码在 EmberJS 应用程序结构中的位置。

不幸的是,在提供代码示例之前我卡住了。任何建议表示赞赏。

编辑:根据@hernanvicente 的优秀问题,我将不活动定义为 'no user input'。所以在 X 期间

内没有 mousemovekey press 事件

这里的难题是 activity 的实际含义。一般来说,我会反对你的想法。无法知道用户是否真的还在浏览您的网页。

但是如果你真的想在用户一段时间内没有做某事之后做某事,那么有趣的问题是在哪里放置代码。

您在这里有多种选择,但可能不是最糟糕的选择是使用应用程序控制器。你也可以使用一个服务,但是你需要在某个地方使用那个服务来初始化它。您可以 只使用一个组件。 如果你想将它与身份验证结合起来,你可以考虑使用现有的 session 服务。

然而,其他一切并不是 ember 具体的。您可以只在应用程序控制器 init 挂钩中放置一些代码并访问 document.addEventListener()。然后你可以只保存一个时间戳并采取相应的行动。

为了让 API 更好地等待 ,您可以利用 ember-concurrencyrestartable 任务:

didSomething: task(function * () {
  yield timeout(1000); // number of miliseconds to wait
  logout();
}).restartable(),

此处logout()会在任务未被调用1秒后被调用。关于 task concurrency and restarable can be found here.

的一个很好的视觉演示

Here is an ember-twiddle showing a complete example.