【问题标题】:Guaranteed Dispatch Sequence保证调度顺序
【发布时间】:2017-08-28 12:58:56
【问题描述】:

我正在尝试找出有关 redux reducer 的一些信息,但我认为术语可能会有所不同,因为这是 JavaScript。

假设如下reducer:

import {
  ONE,
  TWO,
  THREE
} from "../actions/types";

export default function reducer(state = { /* some init state here */ }, action) {
  switch (action.type) {
    case ONE: {
      // this case takes 500ms to finish
      return {...state }
    }
    case TWO: {
       // this case takes 200ms to finish
       return {...state }
    }
    case THREE: {
       // this case takes 100ms to finish
       return {...state }
    }
    default: {
       return {...state }
    }
};

如果我从一个动作中做了以下:

dispatch({type: ONE});
dispatch({type: TWO});
dispatch({type: THREE});

他们能保证按这个顺序解决吗?意思是,状态是否同步和“单线程”?或者case TWO: {} 会在case ONE: {} 完成之前触发吗?

【问题讨论】:

  • 我推测这将以同步方式发生,因为您没有做出任何承诺或任何事情来暂停其处理程序中的操作。提供的代码中没有任何内容向我暗示他们会乱序完成。有兴趣看看是否有人对此进行实际测试。

标签: reactjs synchronization redux react-redux redux-thunk


【解决方案1】:

dispatch 默认情况下是同步的,因此,只要您在操作创建器中没有异步调用,它们就会按照声明的顺序执行。

redux's docs 中暗示dispatch() 是同步的:

动作创建者也可以是异步的并且有副作用。你 可以阅读高级教程中的异步操作以了解如何 处理 AJAX 响应并将动作创建者组合到异步控件中 流。

【讨论】:

  • 是的,原来store.dispatch()函数是100%同步的,返回的时候状态已经更新了。如果中间件拦截操作并执行不同的操作,则会发生任何异步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2018-08-28
  • 1970-01-01
  • 2017-07-10
  • 2016-04-29
  • 2011-02-02
相关资源
最近更新 更多