将redux-thunk与redux-observable混合使用

时间:2018-04-23 10:29:48

标签: redux react-redux redux-thunk redux-observable

我有一个使用redux-thunk的应用程序,想要尝试使用redux-observable。 目前我有一个thunk动作创建者执行以下操作:

const initState = () => {
    return dispatch => new Promise((resolve,reject)=>{
        //these each return axios promises as they get data from the server
        const pr1 = dispatch(processData1())
        const pr2 = dispatch(processData2())
        Promise.all([pr1,pr2])
            .then(r=>resolve(true))
            .catch(e=>reject(e))
        })
    }
}

这是从componentDidMount中的组件调用的,如下所示:

this.props.initState()
    .then(r=>this.setState({loaded:true}))
    .catch(e=>this.setState({loadError:true}))

现在我想尝试使用redux-observable我可以将它与redux-thunk结合使用并替换processData2()调用来调度一个由redux-observable处理的动作吗? 即。

const pr2 = dispatch({type:OBSERVABLE_PROCESSDATA2})

现在据我所知,这不会返回一个承诺,所以原来的代码现在会在Promise.all .then(r=>resolve(true))中立即中断,即使redux-observable epic已经尚未加工。 那么有没有办法让我可以等待这个调度来执行史诗中的异步内容,或者在这种情况下我是否需要基本上一直使用redux-observable?

1 个答案:

答案 0 :(得分:0)

您可以在同一项目中结合使用redux-thunk和redux-observable。

actions ---> redux-thunk ---> redux-observable ---> store

但是redux-observable的想法是action $ in和action $ out。因此,您将需要在史诗中编写所有异步逻辑,并且无权访问返回的observable(即动作流)。

因此,要么您可能想将整个initState转换为史诗,要么就直接在此thunk中直接使用rx.js而不创建史诗