繁体   English   中英

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

[英]How can Redux guarantee no race condition?

我最近了解了Redux。
我很好理解这个概念,但我在官方文档中没有弄清楚这一行:

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

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. 由于这种竞争条件可能会出现奇怪的行为?

因此,动作创建者调度将按顺序应用,但这些动作创建者的实现可能不会按顺序应用,可能导致非确定性代码。

如何弄清楚报价?

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

@DanAbramov本人,我刚刚遇到了这一点 ,非常有意义。

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

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

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

正如文档所述,Redux并没有避免竞争条件,但确实减少了极其微妙 (难以分析)的竞争条件。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM