Какую версию Angular (более важно, rxjs) вы используете?
Помните, что HttpClient возвращает и Observable (ленивая наблюдаемая, которая ничего не будет делать, пока вы не подпишетесь на нее).
https://angular.io/guide/http
Поскольку ваш метод isAuthenticated
возвращает метод Get HttpClient, ваш isAuthenticated
возвращает наблюдаемое ожидание для подписки.
Подписка на наблюдаемую HttpClient сделает httpcall, вызовите следующий обработчик наблюдателей при получении ответа, а также вызовите обработчик on complete, если таковой имеется.Я бы порекомендовал почитать об Observables здесь.https://www.learnrxjs.io/
// Doing this will not do anything as the observable has not been subscribed to.
this.httpClient.get<boolean>(`...`);
// Subscribing to the HttpClient will make the request
this.httpClient.get<boolean>(`...`)
.subscribe((response) => {
// do something with the response
});
Как вы сказали, первый HttpCall сделан, я предполагаю, что вы подписываетесь на метод isAuthenticated
, когда вызываете его?то есть
isAuthenticated().subscribe( (response) => {
//
})
Обратите внимание, что ваш getUserPermissions
также возвращает метод HttpClient (наблюдаемый), но когда вы вызываете его this.getUserPermissions(localStorage.getItem('user_ref'));
, он никогда не подписывается и, следовательно, никогда не вызывается.
Чтобы инициировать этот второй запрос, вам необходимо подписаться на звонок getUserPermissions
, что-то вроде следующего.
public isAuthenticated() {
// ...
return this.httpClient.get<boolean>('...').map(
(response) => {
// Subscribe to the second Http call
this.getUserPermissions(localStorage.getItem('user_ref'))
.subscribe( (response) => {
// do something with the second
})
})
}
Пара дополнительных замечаний;Оператор map
, к которому вы присоединяетесь к методу httpClient.get
, с rxjs v6 устарел в пользу оператора канала.
см .: https://github.com/ReactiveX/rxjs/blob/master/docs_app/content/guide/v6/migration.md
Итак, это
this.httpClient.get<boolean>('...')
.map( ... )
.subscribe(...)
Теперь должно быть написано так:
this.httpClient.get<boolean>('...')
.pipe( // <- Pipe the operators
map( ... ),
map( ... )
)
.subscribe( ...)
Хотя за пределами первоначального вопроса, я бы посмотрел на рефакторинг вашего кода и использовал бы доступные операторы rxjs / для лучшего управления потоком.
this.httpClient.get<boolean>('...')
.pipe(
map(( response ) => {
// some logic
return something;
}),
map( (something) => localStorage.getItem('user_ref')),
switchMap( (userRef) => this.getUserPermissions(userRef)), // <- switchMap to a new observable
)
.subscribe( (responseFromGetUserPermissions) => {
// This value is now the return of getUserPermissions because of switchMap
})
rxjs / observable - действительно мощный паттерн, я настоятельно рекомендую потратить много времени на изучение того, как извлечь из них максимальную пользу.
С уважением, Jono