【问题标题】:How can I cleanly perform a sync operation after the completion of an async thunk完成异步 thunk 后如何干净地执行同步操作
【发布时间】:2018-01-12 17:09:28
【问题描述】:

在一个 React 组件中,我想调度一个异步动作,然后当它完成时,调度一个依赖于异步动作添加的值的同步动作。使用 redux-thunk,到目前为止,我有:

/* actionCreators.js */
export function refresh() {
  return function(dispatch) {
    return services.getData().then(response => {
      return new Promise(resolve => {
        dispatch(addData(response.data))
        resolve()
      })
    })
  }
}

/* myComponent.js */
refreshData = id => {
  this.props.dispatch(refresh(id)).then(() => {
  this.props.handleChange(id)
  })
}

这实际上是有效的,但它似乎有很多嵌套代码,我想知道是否有更标准的方法来处理这个异步。

【问题讨论】:

    标签: javascript asynchronous redux react-redux redux-thunk


    【解决方案1】:

    您在异步操作完成后执行逻辑的总体策略是正确的,您需要从 thunk 返回一个承诺,然后在其他地方使用 then() 来挂钩完成。

    也就是说,您可以进行的第一个有助于精简代码的更改与 Promise 构造函数有关。您可以将refresh() 实现更改为

    export function refresh() {
        return function(dispatch) {
            return services.getData().then(response => {
                return dispatch(addData(response.data));
            }
        }
    }
    

    这是因为Promise<T> 上的.then() 的类型是then<S>(callback: T => S): Promise<S>,这意味着调用then 的结果是另一个promise,所以不需要你自己构造。

    此外,看起来您将标准 function 语法与粗箭头 (=>) 语法混合在一起,同时保持一致并在任何地方使用 => 也有助于精简代码:

    export const refresh = () =>
        dispatch => services.getData()
            .then(response => dispatch(addData(response.data));
    
    /* myComponent.js */
    refreshData = id => this.props.dispatch(refresh(id))
        .then(() => this.props.handleChange(id));
    

    【讨论】:

    • 我确实尝试过简单地返回 dispatch,但由于它是同步 redux 操作,因此没有返回的承诺。这就是为什么我把它包装在一个承诺中。也许我错过了什么:/
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多