3

我怎样才能继续将有效负载传递给我的其他操作员?

例如:

login = (action$: ActionsObservable) => {
    return action$.ofType(SessionActions.LOGIN_USER)
      .mergeMap(({payload}) => {
        return this.http.post(`${BASE_URL}/auth/login`, payload)
          .map(result => ({
            type: SessionActions.LOGIN_USER_SUCCESS,
            payload: result.json().meta
          }))
          .catch(error => Observable.of({
            type: SessionActions.LOGIN_USER_ERROR
          }));
        });
  }

如何将有效负载结果传递给地图操作员?

4

1 回答 1

4

的值在payload内部可用,.map因为该函数是payload 在范围内定义的。您可以payload按照当前编写的方式在该函数中使用:

.map(result => ({
  type: SessionActions.LOGIN_USER_SUCCESS,
  payload: {
    one: result.json().meta,
    two: payload /* this is in parent scope from mergeMap */
  }
}))

但是,如果您想让它更明确,一种方法是使用zip组合可观察对象:

login = (action$: ActionsObservable) => {
    return action$.ofType(SessionActions.LOGIN_USER)
      .mergeMap(({payload}) => {
        return Rx.Observable.zip(
            Rx.Observable.of(payload),
            this.http.post(`${BASE_URL}/auth/login`, payload),
            (payload, result) => { payload, result }
          )
          .map({ payload, result} => ({
            type: SessionActions.LOGIN_USER_SUCCESS,
            payload: result.json().meta
          }))
          .catch(error => Observable.of({
            type: SessionActions.LOGIN_USER_ERROR
          }));
        });
  }

Zip 允许您组合多个可观察对象并提供选择器函数来形成结果对象。根据您的意图,combineLatest可能适合您对类似问题的需求,当您希望在任何源发出时获得每个源的最新值。

于 2017-03-08T17:19:42.120 回答