Я пытаюсь создать приложение Firebase, но что-то происходит, когда я обновляю страницу.
PLACEHOLDER - это элемент-ион, заполненный данными, полученными из firebase.firestore.CollectionReference bookListRef, который поддерживается в службе, известной как BooksService, иего метод, который вызывает страница, это getBookEntries (bookId).
import { Injectable } from '@angular/core';
import * as firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
import 'firebase/storage';
@Injectable({
providedIn: 'root'
})
export class BooksService {
public bookListRef: firebase.firestore.CollectionReference;
constructor() {
firebase.auth().onAuthStateChanged(user => {
if (user) {
this.bookListRef = firebase.firestore().collection(`/bookList`);
console.log(this.bookListRef);
}
});
}
addBook(authorName: string, bookTitle: string, edition: string): Promise<firebase.firestore.DocumentReference>{
return this.bookListRef.add({
authorLastName: authorName,
title: bookTitle,
edition: edition
}).then((bookRef)=>
bookRef.collection("Entries").add({
page: "PLACEHOLDER",
})
);
}
getBookList(authorLastName): firebase.firestore.Query{
return this.bookListRef.where("authorLastName", "==", authorLastName);
}
getBookEntries(bookId: string): firebase.firestore.CollectionReference{
return this.bookListRef.doc(bookId).collection("Entries");
}
}
}
Когда я впервые загружаю страницу, данные PLACEHOLDER загружаются просто отлично.Но когда я обновляю страницу, bookListRef, для которого getBookEntries (bookId) выполняет запрос, не определен.Вставив в консоль операторы console.log, я обнаружил, что метод getBookEntries будет выполняться до того, как конструктор завершит инициализацию bookListRef.То, что действительно озадачивает, - то, что я следую за разделом EventManager обучающего курса пожарного магазина Javabratt, и это поведение не подходит.Я не могу найти принципиальных отличий ни в том, как написаны наши соответствующие сервисы, ни в том, как наши страницы называют эти сервисы.Я добавил в его пример операторы console.log, и каким-то образом его конструктор завершает запрос firebase и инициализирует eventListRef до того, как getEventDetail () должен с ним работать.
Остальная часть постаподробно мои усилия, чтобы сделать эту работу, и пропускаемый.Спасибо за чтение.
Я пытался найти способ гарантировать, что getBookEntries (bookId) не начнет выполняться до тех пор, пока не закончится конструктор.Я пытался использовать цикл while для остановки getBookEntries (bookId) до тех пор, пока не произошла инициализация, но контроль никогда не выходил из цикла, и у меня осталась замерзшая память.Я изучил await / async, но его нельзя использовать в конструкторе, а ngOnInit нельзя использовать в сервисах.