Угловое возвращаемое значение перехватчика за пределами наблюдаемого - PullRequest
0 голосов
/ 21 мая 2018

Я использую Angular 6 и кодирую API, который использует маркеры доступа в качестве механизма аутентификации.По сути, я установил токен Авторизационного канала на заголовках, используя перехватчик, а затем отправил его как запрос.

Сначала я хранил токен доступа в локальном хранилище и получал его оттуда, чтобы установить его в качестве носителя авторизации.,Тем не менее, я сейчас использую IndexDB, так как я начну работать с работниками сферы обслуживания и PWA.Поэтому я сейчас использую асинхронную библиотеку @ngx-pwa/local-storage, которая оборачивает все в наблюдаемые.

Теперь я не знаю, как вернуть значение вне функции, потому что мне нужно получить токен синхронным образом перед отправкой следующего дескриптора перехвата.Каков наилучший способ сделать это?

this.localStorage.getItem('access_token').subscribe(token => {
  const cloned = req.clone({
    headers: req.headers.set('Authorization', 'Bearer ' + token)
  });
  return next.handle(cloned); // does not work
});

Ответы [ 2 ]

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

Итак, this.localStorage.getItem('access_token') получает ключ от IndexDB и возвращает Observable.Единственное, что вам нужно сделать, это дождаться завершения getItem, а затем продолжить с next.handle(cloned), что означает, что вы можете использовать, например, оператор concatMap:

return this.localStorage.getItem('access_token')
  .pipe(
    concatMap(token => {
      const cloned = req.clone({
        headers: req.headers.set('Authorization', 'Bearer ' + token)
      });
      return next.handle(cloned);
    })
  );

Приведенный выше код перейдет кваш перехватчик.

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

Вы можете попробовать использовать ключевые слова async / await:

async someFunction(...){
    ....
    const token = await this.localStorage.getItem('access_token').toPromise();
    const cloned = req.clone({
        headers: req.headers.set('Authorization', 'Bearer ' + this._auth.ACCESS_TOKEN)
    });
    // Do whatever you need to with 'cloned'
}

Ключевое слово await заставит выполнение функции ожидать завершения вызова localStorage.getItem.

...