Angular 10: ngOnInit два промиса - PullRequest
       35

Angular 10: ngOnInit два промиса

0 голосов
/ 04 августа 2020

В настоящее время я пытаюсь реализовать в своем приложении Angular подключение к Strava API.

Для быстрого возобновления:

  1. Пользователь нажимает кнопку для подключения к Strava
  2. Он перенаправляется на Strava для аутентификации (с использованием PKCE)
  3. Strava перенаправляет в мое приложение с кодом
  4. В 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!'));
   }
 }

1 Ответ

0 голосов
/ 27 августа 2020

Наконец-то я понял. Я просто не ждал, пока установится соединение с firebase. Итак, я не смог опубликовать новые данные, потому что я не был аутентифицирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...