метод .get()
возвращает обещание, которое выполняется асинхронно после вызова .then()
.Из-за этого следующая выполняемая строка -
console.log("Service Data :: " + data);
.Javascript не ждет разрешения обещания и вместо этого просто продолжает следующую синхронную строку, которая является второй консолью.
Обычно я делаю это, передавая все обещание другому компоненту или лучшетем не менее, я использую .valueChanges()
из .doc()
, который возвращает наблюдаемое, и использую асинхронный канал в компоненте, которому я передаю:
// Get Observable on document. Returns Observable<any>
const group$ = this.firestore.doc('/groups' + tempId).valueChanges();
У вас тогда есть два варианта:
- Используйте
group$.subscribe();
- Передайте
group$
нужному компоненту и используйте там асинхронный канал
Первый вариант:
// In your component:
let data;
group$.subscribe(doc => {
if (doc.exists) {
data = doc
console.log("Document data:", doc); // No need to call data().
} else {
console.log("No such document!");
},
error => console.log("Error getting document:", error);
)
Второй вариант, переход к компоненту, где вы хотите, чтобы наблюдаемая была оценена и отображались данные:
<div *ngIf="group$ | async as doc">
Your html here {{ doc.someProperty }} further html here...
</div>
Лично я предпочитаю второй вариант, потому что он хорошо сочетается с фреймворком и держит меняот совершения асинхронных ошибок.
Посмотрите репозиторий Angularfire2 Github для документов здесь .Если нет необходимости оценивать наблюдаемое вручную в коде, я бы не стал делать это и позволил бы инфраструктуре обработать его.
И последнее: если вы используете наблюдаемое и хотите при обработке использовать некоторую обработку ошибокасинхронный канал, вы, вероятно, захотите сделать это при создании наблюдаемой:
// Get Observable on document. Returns Observable<any>
// In error case, returns Observable of the error string
const group$ = this.firestore.doc('/groups' + tempId).valueChanges()
.pipe(
catchError(error => of(`Error getting document: ${error}`))
);