2017-03-08 28 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

相關問題