【发布时间】:2017-02-07 19:39:52
【问题描述】:
在我的应用程序中,我们有一个运行时间较长的“供应”任务,它异步完成,我们基本上必须使用轮询来检测它是否已完成。为了在此过程中不会阻止用户使用应用程序,我们在用户交互流程开始时启动了该应用程序。但是,在交互流结束时,用户会采取需要等待该供应任务(如果尚未完成)的操作。这是一个序列图来说明。
[provisioning start][poll for completion....]
[user interactions] [blocked action....][post provisioning task]
我遇到的问题是找出一种在 Redux 中正确执行此操作的惯用方法。以下是我考虑过的一些事情:
- 有一个“requests”reducer,我会在其中存储
Promise用于那个长时间运行的配置任务,然后当[blocked action]执行时,它只是等待承诺。这样做的问题是 Redux 明确要求所有 store 状态都是serializable,所以那里似乎不欢迎像 Promises 这样的东西。 - 订阅
[blocked action]操作创建器中的存储并查找表明配置已完成的数据。不幸的是,我非常喜欢的redux-thunk不包含对商店的引用,只是它的dispatch和getState方法。 - 让我的 React 组件等待配置完成,然后再执行
[blocked action]。我不喜欢这个,因为它给我的视图层增加了太多的动作顺序逻辑意识。
由于这些似乎都不是很好的选择,我目前正在选择:
- 将配置
Promise存储在模块属性中,基本上执行选项#1 而不从存储中获取Promise。我对此并不感兴趣,因为它会将状态移到 redux 循环之外,但这似乎是最简单的选择。
有没有更惯用的方法来使用redux-thunk 实现这一目标?如果有另一个异步中间件可以让这个更干净,我愿意考虑,尽管我已经对redux-thunk 投入了大量资金。
【问题讨论】:
-
你现在的状态是什么样的?
-
简化,但有点像
{ infoUsedForSetup, postSetupInfo, laterActionIsPending },在执行特定操作之前我需要postSetupInfo。但我想对客户隐瞒这一点;我希望他们执行该操作,将laterActionIsPending设置为在 UI 中显示“等待”屏幕的信号,然后在完成时将其清除,无论我们是否必须等待postSetupInfo。
标签: javascript reactjs redux react-redux redux-thunk