7

我已经使用 redux 大约两个月了,最近才开始探索处理异步行为(例如获取数据)的不同方法。从文档GitHub 上的讨论中可以看出,使用thunk 中间件执行此操作的标准方法是一个非常简单的概念,但是我不确定我是否理解将执行异步状态机的责任交给 redux 的好处可以使用简单的独立功能时的中间件。

使用 thunk 中间件的传统 Redux 方法

异步操作创建者fetchPosts

function fetchPosts(reddit) {
  return dispatch => {
    dispatch(requestPosts(reddit))
    return fetch(`http://www.reddit.com/r/${reddit}.json`)
      .then(response => response.json())
      .then(json => dispatch(receivePosts(reddit, json)))
  }
}

那么也许在一个 ReactJS 组件中可能有一个按钮,如下图所示。

调度 fetchPosts

<button onClick={() => this.props.dispatch(fetchPosts(this.props.reddit))} />

单击此按钮时,将调用异步操作创建者requestPosts ,该操作返回一个接受调度的函数,并负责执行任何可能具有副作用的异步代码,并调度可能产生的真实动作。

没有 thunk 中间件的稍微简单的示例

虽然上述内容完全可以理解,但不清楚为什么人们不喜欢只做一些稍微简单一点的事情,如下例所示。

没有动作创建者的委托异步调度

function fetchPosts(dispatch, reddit) {
  dispatch(requestPosts(reddit))
  return fetch(`http://www.reddit.com/r/${reddit}.json`)
    .then(response => response.json())
    .then(json => dispatch(receivePosts(reddit, json)))
}

调用 fetchPosts 函数并将调度作为参数传递。

<button onClick={() => fetchPosts(this.props.dispatch, this.props.reddit)} />

结论

基于并排的两个示例,我看不出使用 thunk 中间件的异步动作创建者如何给我买任何东西,并且它需要在设置中间件时增加复杂性并引入两种动作创建者(1)返回单个的纯函数要调度的动作 (2) 不纯的函数,这些函数将反馈动作和可能的其他 thunk 到调度程序。我觉得我在这里遗漏了一些东西,它可以解释在 redux 中调度不可变动作以外的东西的好处。

4

1 回答 1

7

这是非常好的领域。我想说,异步操作创建者并不是特别令人满意,这是一种普遍的看法,但有充分的理由更喜欢 Redux Thunk 而不是完全手动的方法。但这只是众多可能的方法之一。请参阅为什么我们需要中间件用于 Redux 中的异步流?.

我认为从长远来看,社区可能会选择 Redux Thunk 以外的东西,但它的简单性使它成为一个很好的起点。

于 2016-01-11T04:44:59.790 回答