Как устранить несоответствие Promise в приложении Angular / Typescript? - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь получить объект User из Firestore в моем приложении Angular.

User модель:

import { PlaceLocation } from './location.model';

    export class User {
        constructor(
            public userId: string,
            public userName: string,
            public isMechanic: boolean,
            public location: PlaceLocation
        ) { }
    }

Компонент:

user: User;

this.usersService
    .getUserByUserId(paramMap.get('id'))
    .subscribe(user => {
        this.user = user;
});

Служба пользователей:

getUserByUserId(userId: string) {
    return of(
      firebase.firestore().collection("users").where("userId", "==", userId)
        .get()
        .then((querySnapshot) => {
          console.log("Query Snapshot:", querySnapshot);
        }).catch((err) => {
          console.log("Query Error:", err);
        })
    );
  }

Но я получаю эту ошибку компиляции при попытке назначить this.user = user:

Тип «Обещание» пропускает следующие свойства из типа «Пользователь»: userId, userName, isMechani c, местоположение

Может кто-нибудь сказать, какие изменения необходимы для решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

вы возвращаете наблюдаемое обещание ... думаю, вы хотите from, которое превращает обещание в наблюдаемое.

  getUserByUserId(userId: string) {
    return from(
      firebase.firestore().collection("users").where("userId", "==", userId)
        .get()
    ).pipe(
      map(querySnapshot => { ... do transform ... }),
      tap( // handle errors / logging in observable fashion
        query => console.log(query, 'success),
        error => console.log(error, 'error')
      ),
      // catchError(error => { ... do something with error ... })
    );
  }
0 голосов
/ 04 мая 2020

"от (... обещание ...)" решение не всегда будет работать. Обещание может разрешиться до того, как вы начнете писать.

Верный путь - это сделать сначала заметным:

getUserByUserId(userId: string) {
  return new Observable<any>((observer: Observer<any>) => {
    firebase.firestore().collection("users").where("userId", "==", userId)
        .get()
        .then((querySnapshot) => {
          observer.next(querySnapshot);
          observer.complete();
        }).catch((err) => {
          observer.error(err);
        })

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