javascript - Hur man vet när uppdatering i realtid slutar - Cloud Firestore ionic 4 med angular
Jag använder Cloud Firestore för min databas och har inga problem med läsningar och skrivningar. Mitt problem är att jag inte förstår hur man vet när realtidsuppdateringen har avslutats! Jag använder realtidsuppdatering som beskrivs i den officiella Cloud Firestore-dokumentationen. Den returnerar en funktion istället för ett observable. Nu är jag inte säker på hur jag ska använda det korrekt. Jag behöver köra viss kod efter att data har laddats, men jag har ingen subscribe((data) => {...}) att lägga den där!! Hur gör man det? Om jag visar brist på kunskap, vänligen vägled mig till någon dokumentation. Tack
Den här koden fungerar bra och jag använder den direkt i HTML som ListService.places$för att komma åt dataarrayen.
public places$: BehaviorSubject<Array<Place>> = new BehaviorSubject<Array<Place>>([]);
private unsubscribe: Function;
public list(city: string, country: string) {
return this.unsubscribe = this.firestore.firestore.collection('places')
.where("location.country", "==", country)
.where("location.city", "==", city)
.orderBy("startDate", "desc")
.onSnapshot(querySnapshot => {
const list: Place[] = [];
if(!querySnapshot.docs.length) {
this.places$.next(list);
} else {
querySnapshot.docs.forEach(doc => {
let places = new Place();
place = doc.data() as Place;
places.push(place);
if(list.length === querySnapshot.docs.length) {
this.places$.next(list);
}
});
}
});
}
Svar #1
Du behöver prenumerera på this.places$
this.places$.subscribe((data) => {
console.log(data);
});
Vad realtidsfunktionen returnerar spelar ingen roll, eftersom realtidsfunktionen lägger till utdata till BehaviorSubject.
Se här
let places = new Place();
place = doc.data() as Place;
places.push(place);
if(list.length === querySnapshot.docs.length) {
this.places$.next(list);
}
Det betyder att om du vill göra något med datan behöver du bara prenumerera på places$.
Jag tror också att du har en liten stavningsfel där, du tryckte aldrig värden till list-arrayen.
Det borde vara något i stil med:
...
.onSnapshot(querySnapshot => {
const list: Place[] = [];
if(!querySnapshot.docs.length) {
this.places$.next(list);
} else {
querySnapshot.docs.forEach(doc => {
let place = new Place();
place = doc.data() as Place;
list.push(place);
if(list.length === querySnapshot.docs.length) {
this.places$.next(list);
}
});
}
});
