Ответ Питера имеет суть: getIdToken()
является асинхронным, поэтому к тому времени, как ваш return this.userToken;
запускается, this.userToken = idToken;
еще не запускается. Это должно быть видно из результатов ваших console.log
операторов.
Подробнее об этом см. Как вернуть значение из функции асинхронного обратного вызова? Я настоятельно рекомендую изучить этот ответ. на некоторое время, поскольку это асинхронное поведение невероятно распространено при работе с веб-API.
Исправление для вашего кода - возвращать Promise
вместо попытки вернуть значение:
GetToken(): string {
return new Promise((resolve, reject) => {
this.afAuth.auth.onAuthStateChanged( user => {
if (user) {
user.getIdToken().then(idToken => {
this.userToken = idToken;
resolve(idToken);
});
}
});
})
}
Другими словами: GetToken
возвращает обещание, которое разрешается, как только токен ID становится доступным. Если вы знаете , что пользователь уже вошел в систему при вызове этой функции, вы можете упростить ее до:
GetToken(): string {
const user = firebase.authentication().currentUser;
return user.getIdToken()
}
Разница в том, что вторая функция не ожидает, пока пользовательбудет выполнен вход, поэтому произойдет сбой, если пользователь не вошел в систему.
Затем вы будете использовать любую из перечисленных выше функций, например, в getEmployees
:
public getEmployees(): Observable<Employee[]> {
return new Promise((resolve, reject) =>
this.authService.GetToken().then((idToken) => {
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'JWT ' + idToken
}),
};
this.http.get<Employee[]>(`${this.url}/employee/`, this.httpOptions)
.then(resolve).catch(reject);
})
})
}