Angular получает токен авторизации асинхронно перед вызовами HTTP
Прежде чем опубликовать это, я перешел ко многим другим подобным вопросам и не смог найти решения. как Angular 2 - вставлять токен авторизации перед каждым запросом Http
Я использую сеанс AWS, который предоставляет мне токен авторизации для выполнения HTTP-запроса. Теперь получение сеанса может быть асинхронной операцией в зависимости от необходимости обновления токена.
Проблема: я не могу соединиться, получая сеанс и затем совершая HTTP-вызовы.
Версии угловые 5, RxJs 5.5.2
Функция получения сеанса в AuthService.
getSession(): Observable<any> {
const sessionOb = new Subject<CognitoUserSession>();
// AysnFn4session is a callback implementation
AysnFn4session((err, session) => {
console.log('Found Session');
sessionOb.next(session);
sessionOb.complete();
});
return sessionOb;
}
Функция get сервиса API - След 1
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().switchMap((session) => {
console.log('dasdasd');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
});
}
Функция get сервиса API - Trail 2
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this._authService.getSession().pipe(mergeMap((session) => {
console.log('So what??');
let token = '';
if (session) {
token = session.getIdToken().getJwtToken();
options = options || {};
options.headers = options.headers || new Headers();
options.headers.append('Authorization', token);
}
return this._http.get(url, options);
}));
}
Вот как я называю это API.
getItemInfo(item) {
return this._apiHttp.get('/assets/data/item.json')
.map(res => {
console.log(res);
return res.json();
})
.subscribe(data => console.log(data),
err => console.log(err),
() => console.log('done'));
}
Теперь проблема заключается в том, что в обоих случаях консоль просто печатает, а не выполняется HTTP-вызов.
Found Session
done
Я не могу понять, где я делаю ошибку в использовании mergermap для switchmap для выполнения http-запроса.
1 ответ
Ошибка заключается в getSession()
, Ваш обратный вызов AsynFn4session завершается до того, как наблюдатель субъекта прослушивает. (Наблюдатель субъекта получает только значения, которые испускаются после того, как он подписался). Это означает, что наблюдатель никогда не получит объект излучения, поэтому наблюдаемая последовательность не продолжается. Я бы использовал наблюдаемое вместо предмета
getSession(): Observable<any> {
return new Observable(observer => {
AsynFn4session((err, session) => {
observer.next(session);
observer.complete();
});
});
}