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

时间:2016-12-11 00:38:24

标签: javascript ajax reactjs redux race-condition

我最近了解了Redux 我很清楚这个概念,但我没有在official documentation中找到这一行:

  

因为所有的变化都是集中的,并且严格地逐个发生   订单,没有细微的竞争条件需要注意。

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. 由于这种竞争条件可能会出现奇怪的行为?
  7. 因此,动作创建者调度将按顺序应用,但这些动作创建者的实现可能不会按顺序应用,可能导致非确定性代码。

    如何找出报价?

    我可以理解,对于Redux,有一种关于调度操作历史的跟踪(有助于在运行时理解程序工作流),但这些操作的实际实现又如何呢?

2 个答案:

答案 0 :(得分:3)

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

我认为这很好地解答了我的OP。

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

没有任何同步和可见的时间点,很难掌握发生的事情;这就是Redux带来好处的原因。

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

答案 1 :(得分:1)

  1. Javascript是线程安全的,因此2个函数不能同时运行。

  2. Redux不了解异步操作,它只关心当前状态,调度给它的事件以及如何在给定事件的情况下将当前状态转换到某个其他状态。

  3. 因此,确保行动调度顺序是您的责任,它不是Redux的责任。

  4. 如果有两个事件,X和Y,并且您希望在处理X之前阻止处理Y,那么您可以使用某些状态属性在Redux状态下跟踪它。因此,在处理X之前,您可以轻松地防止处理Y.

  5. 对于异步操作和人们可能希望应用的错误处理有太多不同的要求。因此很难为竞争条件提供一般解决方案。你在谈论。

  6. 设计系统,查找所有边缘案例,并为您可以拥有的每个边缘案例创建新的事件/事件名称/事件处理。然后在redux减速器中处理它们,进行适当的状态转换。在Web应用程序中,没有什么是致命错误(它不是要求用户刷新浏览器的良好UI / UX),因此您必须从每个可能的边缘情况中恢复,因此抛出错误并不是很有意义