Объединение действий в angular RXJS - PullRequest
0 голосов
/ 19 июня 2020

У меня есть фрагмент кода в моем файле эффектов аутентификации. Я хочу связать действия, но делаю это неправильно! Я продолжаю получать ошибки, как будто я не отправляю правильное действие. Я смотрю на все, что могу использовать (mergeMap, switchMap и др. c.), Но меня все сбивает с толку. Мне нужно многому научиться.

Я хочу добиться следующего: проверить, есть ли токен в локальном хранилище> если он есть, затем вызвать api с помощью службы, чтобы получить пользователя по токену> получить результат и превращаю его в правильный пользовательский объект, который я использую во внешнем интерфейсе> отправьте действие входа в систему с этим пользователем

Неисправный код:

@Effect()
init$: Observable<Action> = defer(() => {
   const userToken = localStorage.getItem(environment.authTokenKey);
   let observableResult = of({type: 'NO_ACTION'});
   if (userToken) {

        return this.auth.getUserByToken().pipe(
        tap((res) => console.log('Got user by id: ', res)), 
        switchMap(() => merge(response => {
        return this.prepareUser(response, userToken)
   }, 
    map((user: User) => {
      return of(new Login(user));
    }
    ))));
}
return observableResult;
});


...

prepareUser(response: string, token: string): User {
let res = JSON.parse(response);
let userJson = res.sub;
let user: User = {
  id: userJson.id,
  firstName: userJson.firstName,
  lastName: userJson.lastName,
  email: userJson.email,
  password: userJson.password,
  phone: userJson.phone,
  role: userJson.role,
  status: userJson.status,
  _createdDate: userJson.createdDate,
  _updatedDate: userJson.updatedDate,
  accessToken: {idToken: token, expiresIn: 1800},
  refreshToken: token,
  pic: '',
  _isEditMode: false,
  _userId: userJson.id,
  clear: () => {}
}
return user;

}

PS. Я не знаю, что делает defer (), эту часть кода написал кто-то другой, и я пытаюсь добавить нужную мне функциональность.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 23 июня 2020
import { ofType, createEffect, ROOT_EFFECTS_INIT } from '@ngrx/effects';
import { EMPTY } from 'rxjs';

init$ = createEffect(() => 
  this.actions$.pipe(
    ofType(ROOT_EFFECTS_INIT),
    switchMap(action => {
         const userToken = localStorage.getItem(environment.authTokenKey);
         if (userToken) {
          return this.auth.getUserByToken().pipe(
            map(response => this.prepareUser(response, userToken)),
            map(user => new Login(user))
          )
         } else {
          return EMPTY;
         }
    })
  )
);
0 голосов
/ 19 июня 2020

Так что я продолжал пытаться, и это сработало для меня, я подумал опубликовать это здесь, на всякий случай, если это поможет кому-то еще. Мне действительно нужно сесть и изучить RX JS должным образом, поэтому этот ответ может быть неправильным, но он делает то, что я хочу:

return  of({}).pipe(
    mergeMap(_ => this.auth.getUserByToken())
  ).pipe(
    map(response => this.prepareUser(response, userToken)),
    mergeMap(user => of(new Login(user)))
    );
...