api响应后,可从redux可观察的史诗访问最新状态

时间:2019-06-25 04:02:08

标签: redux redux-observable

我已经阅读了Accessing the state from within a redux-observable epic,但这对我寻找答案没有帮助。

我在我的react-redux应用程序中使用redux-observable,我有一个史诗将触发API调用,代码如下:

const streamEpicGet = (action$: Observable<Action>, state$) => action$
  .pipe(
    ofType(streamActions.STREAM_ITEM_GET),
    withLatestFrom(state$),
    mergeMap(([action, state]) => {
      return observableRequest(
      {
        failureObservable: error => {
          const actions = []
          return actions
        },
        settings: {
          body: queryParams, // I can access to the state data here to organize the query params I need for calling the API
          url: '/path/to/api',
        },
        successObservable: result => {
          const { pushQueue } = state
          // here I want to access to the latest state data after API response
        }
      })
    }),
  )

在上面的代码中,我使用withLatestFrom(state$),因此我可以在执行mergeMap操作员代码时访问最新数据,也就是说,我可以在此处访问状态数据来组织查询API的参数。

但是,在API请求发出之后和响应之前的这段时间内,还有其他动作在发生,它们正在更改状态pushQueue,因此在API响应之后,我想读取最新状态{{ 1}}在我的pushQueue回调中。

我的问题是,我总是获得与准备查询参数时相同的状态数据,即:在successObservable回调中API响应后,我无法获取最新的状态数据。

谢谢,让我知道您是否需要更多信息。

1 个答案:

答案 0 :(得分:0)

const streamEpicGet = (action$: Observable<Action>, state$) => action$
  .pipe(
    ofType(streamActions.STREAM_ITEM_GET),
    withLatestFrom(state$),
    mergeMap(([action, state]) => {
      return observableRequest(
      {
        failureObservable: error => {
          const actions = []
          return actions
        },
        settings: {
          body: queryParams, // I can access to the state data here to organize the query params I need for calling the API
          url: '/path/to/api',
        },
        successObservable: result => {
          const { pushQueue } = state$.value // Use state$.value to always access to the latest state
          // here I want to access to the latest state data after API response
        }
      })
    }),
  )

所以答案是使用state$.value

我通过阅读redux-observable Migration document

中的Accessing状态来获得此信息