В настоящее время я пытаюсь реализовать в своем приложении Angular подключение к Strava API.
Для быстрого возобновления:
- Пользователь нажимает кнопку для подключения к Strava
- Он перенаправляется на Strava для аутентификации (с использованием PKCE)
- Strava перенаправляет в мое приложение с кодом
- В ngoninit я проверяю параметры маршрута, и если я Имея код, я запускаю два связанных обещания: первое для получения токена доступа от Strava, затем запись в базу данных (Firebase).
Проблема в том, что иногда данные записываются в firebase а иногда и нет. Поведение не систематизировано c. Странно то, что я go в свой postNewToken каждый раз, потому что консоль регистрирует это.
- Если я просто записываю в firebase (без запроса токена Strava) в ngOnInit (), он создается в 100% случаев.
- Если у меня есть кнопка, запускающая запрос токена и запись в firebase, кажется, что она работает каждый раз.
Понятия не имею как это решить. Кажется, это скорее вопрос объединения обещаний в ngOnInit, но я даже не знаю, как его обойти.
Код моего компонента:
ngOnInit() {
const stravaCode = this.route.snapshot.queryParamMap.get('code');
if (stravaCode !== undefined) {
this.stravaService.handleStravaAuthorizationCode(stravaCode);
}
И в связанной службе:
// Handle Strava Code received
handleStravaAuthorizationCode(authorizationCode: string) {
this.getStravaToken(authorizationCode).then(res => {
this.postNewToken(res).then(res => {
this.router.navigate(['encoding']);
});
});
}
// Get Strava access token to make the requests to the API -> only done once
getStravaToken(authorizationCode: string){
if (authorizationCode !== undefined){
console.log('Authorization code: ' + authorizationCode);
const data = {
client_id: environment.strava.client_id,
client_secret: environment.strava.client_secret,
code: authorizationCode,
grant_type: 'authorization_code'
};
return this.http.post<StravaToken>(this.stravaTokenURL, data)
.pipe(catchError(this.errorService.handleHttpError)).toPromise();
}
}
postNewToken(stravaToken: StravaToken) {
if (this.authService.isLoggedIn) {
console.log('Recording strava token into Firebase');
console.log(stravaToken);
return this.afs.collection('strava_tokens')
.add(stravaToken).then(res => console.log(res), err => console.log(err));
} else {
return Promise.reject(new Error('No User Logged In!'));
}
}