Как передать данные действия вниз по потоку потока оператора в rxjs?

У меня есть ситуация, когда я хочу получить доступ к полезной нагрузке действия в операции третьего уровня. Я смог сделать это в операторах lettable, но как я могу сделать то же самое с оператором pipeable?

это мой код,

 @Effect()
  onTrySignin = this.actions$.pipe(
    ofType(AuthActions.TRY_SIGNIN),
    map((action: AuthActions.TrySignin) => {
      return action.payload;
    }),
    switchMap(action => {
      return this.httpService
        .postRequest('UserAccounts/Login', action.credentials);
    }), catchError((error: HttpErrorResponse) => {
      return Observable.of(new AuthActions.FailedAuth(error));
    }),
    mergeMap((response: any) => {
      // how to access action payload here?
    })
  );

person JSON    schedule 27.06.2018    source источник


Ответы (2)


Вы можете использовать map() для передачи данных по наблюдаемой цепочке следующим образом:

// both foo and bar will be available on next()
from(AsyncFooData()).pipe(
  concatMap(foo => AsyncBarData().pipe(
    map(bar => ({foo, bar})
  )),
  tap(val => console.log(val), // chain more operators here...
).subscribe(({foo, bar}) => {
  // do stuff with foo and bar
})

FWIW, я взял этот ответ из этот вопрос, где я опубликовал несколько аналогичный ответ.

person kctang    schedule 27.06.2018

хорошо, это pipe внутри pipe

 @Effect()
  onTrySignin = this.actions$.pipe(
    ofType(AuthActions.TRY_SIGNIN),
    map((action: AuthActions.TrySignin) => {
      return action.payload;
    }),
    switchMap(actionPayload => {
      return this.httpService.postRequest('UserAccounts/Login', actionPayload.credentials).pipe(
        mergeMap((response: HttpResponse<IApiResponder<string>>) => {
          switch (response.status) {
            case 200:
              if (actionPayload.returnUrl) {
                this.router.navigate([actionPayload.returnUrl]);
              } else {
                this.router.navigate(['/dbapp']);
              }
              return Observable.concat(
                Observable.of(new AuthActions.GenerateAntiforgeryToken()),
                Observable.of(new AuthActions.Signin(this.authService.getUserData())),
              );
          }
        }),
        catchError(e => {
          return Observable.of(new AuthActions.FailedAuth(e));
        }),
      );
    }),
  );
person JSON    schedule 28.06.2018
comment
Я перечитывал ваш вопрос и собирался предложить вам вместо этого pipe из postRequest, чтобы у вас был доступ к action. Похоже, вы уже делаете это. Удивлен, что вы отметили мой ответ как правильный, так как он не решил вашу проблему... но все равно ура! :-) - person kctang; 28.06.2018
comment
@kctang, ваш ответ привел меня к цепным трубам, которые являются основным решением моего вопроса, AsyncFooData и трубам AsyncBarData, спасибо :) - person JSON; 28.06.2018