2017-03-08 88 views
1

如何继续将有效载荷传递给其他操作员?可重复观察如何继续传递有效载荷

例如:

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 
      })); 
     }); 
    } 

如何传递的有效载荷结果到地图操作?

回答

2

​​的值在.map内可用,因为该功能是用​​in scope定义的。您可以在该函数内使用​​它正在编写方式:

.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可能适合您类似问题的需求,当您希望每当任何源发出时每个源的最新值。

+1

正是。但只是为了再次重申凯尔所说的,你不需要*将它们压缩,它已经在范围内!只是引用它 .MAP(结果=>({ 类型:SessionActions.LOGIN_USER_SUCCESS, 有效载荷:{ 之一:result.json()元, 2:有效载荷/ *这是在从mergeMap */ 父范围} })) – jayphelps

相关问题