我现在已经使用redux大约两个月了,并且刚刚开始探索处理异步行为的不同方法,例如获取数据。从documentation和discussions on GitHub看来,使用thunk middleware这是一个非常简单的概念的标准方法,但是我不确定我是否理解这个好处在可以使用简单的独立函数时,将执行异步状态机的责任交给redux中间件。
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组件中,可能会有一个按钮,例如下面的按钮。
<button onClick={() => this.props.dispatch(fetchPosts(this.props.reddit))} />
点击此按钮会调用异步操作创建者 requestPosts ,它会返回一个接受 dispatch 的函数,并负责执行任何可能产生副作用的异步代码,也会调度可能导致的真实行为。
虽然上述内容完全可以理解,但不清楚为什么人们不愿意做一些稍微简单化的事情,如下例所示。
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)))
}
<button onClick={() => fetchPosts(this.props.dispatch, this.props.reddit)} />
基于这两个示例,我不知道使用thunk中间件的异步动作创建者是如何购买任何东西的,并且它需要在设置middlware时增加复杂性并引入两种动作创建者(1)纯返回要调度的单个动作的函数(2)不正确的函数,它们将动作和其他thunks反馈到调度程序中。我觉得我在这里遗漏了一些东西,这些东西可以解释在redux中调度除了不可变动作之外的其他东西的好处。
答案 0 :(得分:6)
这是非常好的踏实领域。我会说,异步动作创建者并不是特别令人满意的常见情绪,但有充分的理由让Redux Thunk更喜欢完全手动的方法。但这只是众多可能方法中的一种。请参阅Why do we need middleware for async flow in Redux?。
我认为从长远来看,社区可能会选择Redux Thunk以外的东西,但它的简单性使它成为一个很好的起点。