javascript - Redux 如何保证没有竞争条件?

标签 javascript ajax reactjs redux race-condition

我最近学习了 Redux。
我很理解这个概念,但我没有弄清楚 official documentation 中的这一行:

Because all changes are centralized and happen one by one in a strict order, there are no subtle race conditions to watch out for.

Redux 如何保证没有微妙的竞争条件?

确实,我可以想象这个场景(按顺序):

  1. 一些组件调度 ACTION_TYPE_1。
  2. 一些组件调度 ACTION_TYPE_2。
  3. ACTION_CREATOR_1 调用 ajax 来获取一些数据。
  4. ACTION_CREATOR_2 调用 ajax 来获取一些数据。
  5. ACTION_CREATOR_2 在 ACTION_CREATOR_1 之前处理抓取的数据。
  6. 由于这种竞争条件可能会出现奇怪的行为?

因此, Action 创建者分派(dispatch)的操作会按顺序应用,但这些 Action 创建者的实现可能不会按顺序应用,这可能会导致代码不确定。

如何计算报价?

我可以理解,对于 Redux,有一种关于调度 Action 历史的trace(有助于理解运行时的程序工作流程),但是这些 Action 的真正实现呢?

最佳答案

我刚遇到 this point ,非常有意义,作者是@DanAbramov 本人。

我认为它很好地回答了我的 OP。

关键是只要 Action 的调度保持同步(尽管 Action 创建者的内部过程可能根本不同步),就很容易快速找出竞争条件(或其他关于非确定性的问题)通过建立和记录 dispatch 行动的历史。
特别是很容易重现“怪异”状态,然后找出如何避免它(如 Event-Sourcing )。

如果没有任何同步可见的时间点,就很难掌握发生了什么;这就是 Redux 带来好处的原因。

Redux 不会避免竞争条件,但确实会大大减少微妙(难以分析)的竞争条件,如文档所述。

关于javascript - Redux 如何保证没有竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081849/

相关文章:

javascript - 在 Node Js 中使用异步函数比使用同步函数有什么性能优势吗?

c# - ASP.NET MVC 5 模型绑定(bind)不起作用

ruby-on-rails - 如何在 Rails 中禁用数据后重新启用提交按钮

reactjs - react 还原 RangeError : Maximum call stack size exceeded

javascript - 向服务器发出 POST 请求以插入记录并在客户端检索生成的 ID 的方法

javascript - 如何导出具有 2 种样式对象的 React Material-ui 组件? ( Material -ui V1)

javascript - 我如何遍历嵌套的部分元素?

jquery - 通过 jQuery ajax 调用 JSF 操作

javascript - react : update one item in a list without recreating all items

reactjs - 如何使用 ESLint 捕获 React 中未声明的变量?