Служба Angular7 - возвращение наблюдаемой, которая содержит данные из другой наблюдаемой, но подписки на эту вторую наблюдаемую в компоненте? - PullRequest
0 голосов
/ 11 декабря 2018

В моем сервисе есть функция, которая возвращает Observable (запрос http), который должен быть сформирован специальным токеном.Поэтому, прежде чем я смогу получить эту функцию, мне нужно получить токен, чтобы можно было сделать запрос.

Я искал способы связать эти запросы или получить этот токен, чтобы убедиться, что он существует до того, как будет выполнен этот запрос, а потому, что это делается в конструкторе, когда вы загружаете страницу самой первойвремя, когда токен отсутствует, и HTTP-запрос не выполняется.

В настоящее время в моем сервисе есть блок if, например:

 if (!this.activeDirectoryToken) {
      this.adalService
        .acquireToken('https://graph.windows.net')
        .subscribe(token => {
          this.activeDirectoryToken = token;
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN
            });
        } else {
// RETURN OBS LOGIC OF THE SECOND HTTP REQUEST USING THE TOKEN

Но, конечно, если я попытаюсь подписатьсядля этой функции и запуска блока if будет выдано сообщение об ошибке, поскольку для этого типа подписка не будет существовать.

Я также храню токен в хранилище избыточных данных и подписываюсь на него в конструкторесервис, и у меня есть другой блок if, чтобы сделать запрос на него в случае, если он пуст / ложно.

Тем не менее, первый запрос все еще не выполнен из-за отсутствия установленного токена.

1 Ответ

0 голосов
/ 11 декабря 2018

Первый метод возвращает токен.Если он уже был кэширован, просто верните текущий токен, иначе получите новый токен и кэшируйте его.

После этого вы можете использовать switchMap, чтобы выполнить http-запрос для вашей второй части и подписаться.

getToken(): Observable<string> {
   if (this.activeDirectoryToken) 
       return Observable.of(this.activeDirectoryToken);

   return this.adalService
      .acquireToken('https://graph.windows.net')
      .pipe(
          do(token => this.activeDirectoryToken = token)
       );
}

secondPart(){
    this.getToken().pipe(
      switchMap( token => SECOND HTTP REQUEST USING THE TOKEN)
    )
    .subscribe(...);
}

Примечание: не проверено

...