如何从epic redux-observable中设置componentDidMount方法中的数据状态

时间:2018-03-31 11:44:37

标签: reactjs redux rxjs redux-observable

我是redux-observable的新手。我有一个史诗函数,它请求api调用并发出新的成功动作。在我的反应视图中获取数据的干净方法是什么?在我的componentDidmount方法中,我调用了getUsers redux操作。我想在componentDidmount中设置状态,但它只运行一次,不会等待promise epic。

const getUsersEpic = action$ =>
    action$.ofType(GET_USERS)
        .mergeMap( action =>
            Observable.fromPromise(
                axios({
                    method: 'get',
                    url: API_USERS,
                    headers : getHeaders().toObject()
                })
            )
        )
        .flatMap((response) => {
            if(response.status == 200) {
                return [{
                    type: GET_USERS_SUCCESS,
                    data: response.data,
                    status: response.status
                }]
            }
            else {
                return [{
                    type: GET_USERS_ERROR,
                    message: 'error',
                    status: response.status
                }]
            }
        })
        .catch( error => {
            // console.log('error', error)
            return setResponseError(error,  GET_USERS_ERROR);
        });

1 个答案:

答案 0 :(得分:1)

您在componentDidMount()中发送一个由redux-observable拦截并用于进行ajax呼叫的操作。因此,您将在以后的某个时间点向redux发送GET_USERS_SUCCESSGET_USERS_ERROR操作。通常,无法在组件中等待这些操作。我认为这是一个很好的限制,因为这限制了组件中的异步处理,这可能在很多方面引入错误。

您需要做的是在reducer中设置默认状态,稍后通过请求响应进行更新,并将其作为道具传递给您的组件。

另外,还有一个redux-observable作者的check out this answer

顺便提一下,有什么理由说你为Axios而不是AjaxObservable