带有 Flux 的 Reactjs:何时何地在 Flux 应用程序中初始化计时器实用程序

Reactjs with Flux: when and where to initialize a Timer utility in a Flux application

我的申请中发生了三件不同的事情:

  1. 计时器设置为 10 秒间隔,直到被要求才停止
  2. 一旦计时器重新开始,异步 Api 实用程序模块会触发一个函数来调用 Api。
  3. 我有一个组件(带有随附的 Action 和 Store 模块),它获取 api 数据(具有相同属性的相似项目的列表)并将它们呈现到页面。

我的问题是:

Where and When do I initialize the timer to being so that my Component can start receiving data after its render() method is invoked?


我考虑过在达到 return 之前将它放在 render 函数中,但这没有意义,因为我需要将 api 数据呈现给页面一旦收到数据。

我是否错误地构建了这个应用程序?我的 Timer and/or Api 实用程序也应该是 React 组件吗?

我相信有几种方法,但这是我的 2 美分:

假设您有 LogViewer 应用程序并且您希望每 10 秒获取并显示一次日志。

  • 那么你会有一个 LogStore 和一个 LogViewer 组件。
  • LogViewer 组件的 componentDidMount 方法中,我会调用 LogStore.getLogs().
  • LogStore.getLogs() 会调用 APIUtils.getLogs() 并设置一个定时器,每 10 秒触发一次,每次触发时都会调用 APIUtils.getLogs()。设置定时器后 LogStore.getLogs() 立即 returns 一个空数组。
  • 空数组由 LogViewer 组件呈现(或显示加载栏)。
  • 与此同时,来自 APIUtils.getLogs() returns 和 GET_LOGS_SUCCESS 服务器操作的 ajax 调用被分派到所有商店。
  • LogStore 保存传入日志并为 LogViewer 组件发出更改事件以再次调用 LogStore.getLogs() 函数。
  • 如果你想在某个时候停止计时器,那么在 LogViewer 组件中我会有一个停止按钮,当点击它时会创建 GET_LOGS_STOP 动作。
  • GET_LOGS_STOP 动作被分派到 LogStore 时,它会通过停止计时器做出反应。

我认为这可以满足您的要求。