如何在ngrx中产生效果

时间:2017-05-15 06:07:48

标签: angular typescript rxjs ngrx

我使用this作为模板在ngrx中创建了一个简单的效果。我的代码略有不同:

`

@Effect()
 addSeries$ = this.actions$
     //Listen for the 'ADD_SERIES' action
     .ofType(GraphsActions.ADD_SERIES)
     //use that payload to construct a data query
     .map(action => action.payload)
     .switchMap(payload => this.http.get(/*making a url with payload here*/)
     // If successful, dispatch success action with result
     .map(res => ({ type: GraphsActions.SERIES_DATA, payload: res.json() }))
     // If request fails, dispatch failed action
     .catch(() => Observable.of({ type: 'FAILED' })));

`

在最终地图中,我希望有效载荷包含来自第一张地图的初始有效载荷的信息,如何实现?

我仍然在处理这些流媒体内容的工作方式时遇到了一些麻烦,所以如果有人能提供一个英文解释,说明这里发生的事情也会有所帮助。

1 个答案:

答案 0 :(得分:4)

使用ngrx时,Effect允许您在调度某些操作时触发副作用。
也就是说,一个简单的效果工作流程将是:
- 派遣FETCH_PERSON_DETAILS(有效负载:{personId: string})。在reducer中,只需将布尔值isFetchingDetails设置为true即可 这允许您在加载该人的详细信息时显示一个微调器(例如) - 从效果中捕获该操作并启动HTTP请求以获取详细信息 - 获得响应后,使用响应中的数据发送FETCH_PERSON_DETAILS_SUCCESS - 如果在获取数据时发生错误,请仅使用FETCH_PERSON_DETAILS_FAILED(您可以在之前的personId中找到)发送action.payload

在这里,您的问题只是代码缩进。 如果我们重新缩进它:

@Effect()
addSeries$ = this.actions$
  .ofType(GraphsActions.ADD_SERIES)
  .map(action => action.payload)
  .switchMap(payload => this.http.get(/*making a url with payload here*/)
    .map(res => ({ type: GraphsActions.SERIES_DATA, payload: res.json() }))
    .catch(() => Observable.of({ type: 'FAILED' })));

我们可以看到map已进入switchMap。因此,从地图中,您可以访问switchMap参数 - > payload

因此,为了获得前一个有效负载+响应的内容,您可以这样做:

.switchMap(payload => this.http.get(/*making a url with payload here*/)
  .map(res => ({ type: GraphsActions.SERIES_DATA, payload: {action.payload, ...res.json()} }))

(或根据需要重新安排有效载荷)