Как отправить действие перед выполнением http-вызова в эффектах Angular NgRx? - PullRequest
0 голосов
/ 05 июня 2019

Сначала я хочу вернуть токен действия, после чего я хочу сделать http-вызов, где я отправлю другое действие.Я не знаю, как вернуть две вещи.

@Effect()
  login$ = this.actions$.pipe(
    ofType(AuthActionTypes.LOGIN),
    map(userData => userData.payload),
    exhaustMap((user: any) => {
      return this.userService.login(user.username, user.password)
        .pipe(
            map((res: any) => {
              console.log('authorization' + res.headers.get('Authorization'));
              return new Token({
                token: {
                  token: res.headers.get('Authorization')
                }
              }),
              return this.http
                .get(`${this.restServiceRoot}${this.currentUserRestPath}`)
                .pipe(
                  map((response: any) => {
                    return new LoginSuccess({
                      user: {
                        user: response.name,
                        role: response.role,
                      }
                    });
                  }),
                );
            })
            );
    }),
    catchError(error => of(new LoginFail({error: error})))
  );

1 Ответ

0 голосов
/ 05 июня 2019

Есть два способа ее решения - 1.

@Effect
login$ = this.actions$.pipe(
    ofType(AuthActionTypes.LOGIN),
    map(userData => userData.payload),
    exhaustMap((user: any) => {
      return this.userService.login(user.username, user.password)
        .pipe(
            mergeMap((res: any) => {
              console.log('authorization' + res.headers.get('Authorization'));
              this.store.dispatch(new Token({
                token: {
                  token: res.headers.get('Authorization')
                }
              }));              
              return this.http
                .get(`${this.restServiceRoot}${this.currentUserRestPath}`)
                .pipe(
                  map((response: any) => {
                    return new LoginSuccess({
                      user: {
                        user: response.name,
                        role: response.role,
                      }
                    });
                  }),
                );
            })
            );
    }),
    catchError(error => of(new LoginFail({error: error})))
  );

ИЛИ В своем действии входа в систему вы возвращаете действие токена для обновления токена в вашем магазине и еще одно действие для извлечения ресурса из "$ {this".restServiceRoot} $ {this.currentUserRestPath}».В результате второго действия вызовите ваш http, используя «$ {this.restServiceRoot} $ {this.currentUserRestPath}» [рассмотрите приведенный ниже код как псевдо-код - ОБРАТИТЕ ВНИМАНИЕ - По некоторым причинам форматирование кода не работает, поэтому скопируйте и вставьте код вваш редактор] -

@Effect()
login$ = this.actions$.pipe(
ofType(AuthActionTypes.LOGIN),
    map(userData => userData.payload),
    exhaustMap((user: any) => {
      return this.userService.login(user.username, user.password)
        .pipe(
            mergeMap((res: any) => {
              console.log('authorization' + res.headers.get('Authorization'));
              return [new Token({
                token: {
                  token: res.headers.get('Authorization')
                }
              }), new GetCurrentUserRestPath()]
              )         
            );
    }),
    catchError(error => of(new LoginFail({error: error})))
  );

@Effect()
  login$ = this.actions$.pipe(
    ofType(AuthActionTypes.GET_CURRENT_USER_REST_PATH),    
    switchMap((user: any) => {
      return this.http
      .get(`${this.restServiceRoot}${this.currentUserRestPath}`)
      .pipe(
        map((response: any) => {
          return new LoginSuccess({
            user: {
              user: response.name,
              role: response.role,
            }
          });
        }),
      );
    }),
    catchError(error => of(new LoginFail({error: error})))
  );

Мотыга, это даст вам представление о том, как решить вашу проблему.

...