javascript - ¿Se llamó varias veces a la suscripción de Observable?
Tengo el siguiente Observable:
dataService.ts
findMessages(chatItem: any): Observable<any[]> {
return Observable.create((observer) => {
this.firebaseDataService.findMessages(chatItem).subscribe((firebaseItems: any[]) => {
// do something
observer.next(somedata);
});
});
}
que llama a esta función:
firebaseDataService.ts
findMessages(chatItem: any): Observable<any[]> { // populates the firelist
return this.af.database.list('/message/', {
query: {
orderByChild: 'negativtimestamp'
}
}).map(items => {
const filtered = items.filter(
item => ((item.memberId1 === chatItem.memberId1 && item.memberId2 === chatItem.memberId2)
|| (item.memberId1 === chatItem.memberId2 && item.memberId2 === chatItem.memberId1))
);
return filtered;
});
}
La función dataService.findMessages(chatItem) solo se llama una vez.
Esto observa la lista de Firebase. Así que si algún elemento de la lista cambia, este Observable se activa.
Problema
Si se accede a la función, o se agrega un elemento a la lista, el Observador se dispara como se espera, pero la línea // hacer algo se llama varias veces. Yo esperaría que solo se llamara una vez.
Pregunta
- ¿Hay alguna manera de garantizar que solo se llame una vez?
- ¿O una vez que se llama por primera vez, para salir de
subscribe? - ¿O mi código está completamente mal?
Cualquier consejo es apreciado.
Respuesta #1
pero la línea/hacer algo se llama varias veces
Se llama en el callback pasado a this.firebaseDataService.findMessages(chatItem).subscribe. La función subscribe se ejecutará cada vez que haya un nuevo elemento. Si solo quieres tomar un elemento, puedes usar el operador take.
Más
Documentos sobre take : https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/take.md