【问题标题】:Chaining redux action creator Promise.then() in react component在反应组件中链接 redux 动作创建者 Promise.then()
【发布时间】:2017-05-21 13:03:03
【问题描述】:

我计划在我的 redux 操作创建器中使用 axios 进行异步调用和承诺。目前还没有可以使用的 API,所以我将内容保存在本地。

如何在反应组件中使以下内容可链接?

动作创作者

export function fetchResultsIfNeeded() {
    return (dispatch, getState) => {
        if (true) {
            return dispatch(fetchResults(day, hash));
        }

        else {return Promise.resolve();}
    };
}

export function fetchResults(day, hash) {
    return (dispatch) => {
        // Dispatch something here

        return new Promise(resolve => setTimeout(resolve, 1000)).then(() => {
            // Do some stuff here
            // Dispatch some other stuff here as well
        }); // Want to chain on this promise in react component
    };
}

反应组件

import { fetchResultsIfNeeded } from 'actions';

// Class based react component
checkResults(periodFrom, periodTo) {
    this.props.fetchResultsIfNeeded([periodFrom, periodTo]).then(() => {/* Do some stuff here */});
}

// Connected via react redux
export default connect(null, { fetchResultsIfNeeded })(component);

目前收到如下错误,莫非还在等待react-redux左右?

Uncaught TypeError: Cannot read property 'then' of undefined

将动作创建者和组件放在 Pen 中(不知道如何显示完整代码)

Full component code, Full action creator code

【问题讨论】:

  • 这对我来说是正确的。您可能忘记安装redux-thunk 中间件了吗?
  • @Jacob 不,在这个应用程序上使用了一段时间 :)
  • 你能发布一个更完整的 React 组件示例吗?也许问题出在某个地方。
  • @Jacob 查看更新的问题;)
  • 确保 fetchResults() 中的 then() 返回一个 promise

标签: javascript reactjs redux


【解决方案1】:

我假设您使用的是redux-thunk。您需要从动作创建者中的解析函数返回。正确的流程应该是:

export function fetchResults(day, hash) {
    return (dispatch) => {
        
        dispatch(...).then(
             ( ) => {
                 // Do some stuff here
                 return dispatch(...)
             }
        )            
    }
}

【讨论】:

  • 但是 fetchResults 应该返回一个承诺,所以那里没有另一个调度。请参阅 react 组件中的用法:)
  • 对不起,有点晚了,我没有看到组件,也没有看到连接用法
  • 不用担心,我只是想知道为什么它不起作用,即使我在组件中执行console.log(this.props.fetchResultsIfNeeded) ,它也会返回undefined。我不确定出了什么问题
  • 可能检查'actions.js'文件的路径,如果prop未定义,则表示connect不工作
  • 如果 this.props.fetchResultsIfNeeded 未定义,你怎么能在 checkResults 内部调用它?你应该得到undefined is not a function
【解决方案2】:

执行此操作的方法不止一种,但使用现有代码执行此操作的最简单方法可能是使用bindActionCreators

import { fetchResultsIfNeeded } from 'actions';
import { bindActionCreators } from 'redux';

// Class based react component
checkResults(periodFrom, periodTo) {
    this.props.fetchResultsIfNeeded([periodFrom, periodTo]).then(() => {/* Do some stuff here */});
}

// Connected via react redux
export default connect(
  null,
  dispatch => ({
    ...bindActionCreators({ fetchResultsIfNeeded }, dispatch)
  })
)(component);

【讨论】:

  • connect 调用在我的项目中绝对有效;更详细的动作创建者绑定不应该是必要的。
  • 是的,但是没有 bindActionCreators,他需要将动作包装在 dispatch() 中。比如: dispatch(this.props.fetchResultsIfNeeded(...)).then(...) 但是你需要一个参考调度,你通常通过 connect() 传入(因此需要传递一个函数作为 mapDispatchToProps 而不是一个对象: connect(null, dispatch => { fetchResultsIfNeeded, dispatch }) )
  • react-redux 会自动执行 bindActionCreators 如果您传递一个对象以连接到操作。
  • 我现在有点困惑@Jacob,我还需要建议吗?
  • 我认为你不需要做这个建议;我唯一的猜测是原来的 fetchResultsIfNeeded 不是一个函数,或者你的组件有些奇怪,因为到目前为止你发布的模式与我们使用的模式完全相同,并且运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多