RxJs Наблюдаемый forkJoin - PullRequest
0 голосов
/ 01 мая 2018

Я пишу сервис на Angular 5 (RxJs 5.5.1), и у меня есть следующий сценарий, в котором я пытаюсь реализовать рабочий процесс входа в систему.

...
signInBasic(user: string, pwd: string): Observable<AuthenticationStatus> {
    return this.http.post('some_url', params, { observe: 'response', responseType: 'text' })
      .map((response: HttpResponse<Object>) => {
        this.status = response.status === 200 ? AuthenticationStatus.Authenticated : AuthenticationStatus.NotAuthenticated;
        return this.status;
      })
      ...
      /* HERE */
      ...

}

getPrimaryInfo(): Observable<any> {}
getPermissions(): Observable<any> {}
...

В точке /* HERE */, в зависимости от значения this.status (в частности, Authenticated), я хотел бы запустить еще два HTTP-запроса (с помощью методов getPrimaryInfo и getPermissions), чтобы получить некоторые данные пользователя от бэкэнд После завершения обоих я хотел бы вернуть this.status как возвращаемое значение метода signInBasic. Если пользователь не аутентифицирован, я все равно верну this.status со значением AuthenticationStatus.NotAuthenticated, поскольку оно было установлено ранее.

Я искал forkJoin, но я не понимаю, как я могу вернуть что-то только после завершения этих двух HTTP-вызовов.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

switchMap с функцией проекции - ваш друг в этом случае:

return this.http.post('some_url', params, { observe: 'response', responseType: 'text' })
  .map((response: HttpResponse<Object>) => {
    this.status = response.status === 200 ? AuthenticationStatus.Authenticated : AuthenticationStatus.NotAuthenticated;
    return this.status;
  })
  .switchMap(status => (status === AutheticationStatuses.Authenticated)
                          ? forkJoin(getPrimaryInfo(), getPermissions())
                          : of(null),
             (status, inner) => status);
0 голосов
/ 01 мая 2018

Вы можете использовать concatMap, чтобы дождаться завершения forkJoin, а затем отобразить результат в this.status независимо от того, что вернули два запроса.

signInBasic(user: string, pwd: string) {
  return this.http.post('some_url', params, ...)
    .concatMap((response: HttpResponse<Object>) => {
      this.status = response.status === 200 ? AuthenticationStatus.Authenticated : AuthenticationStatus.NotAuthenticated;

      if (this.status === AuthenticationStatus.Authenticated) {
        return forkJoin(getPrimaryInfo(), getPermissions())
          .pipe(
            map(() => this.status),
          );
      } else {
        return of(this.status);
      }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...