Búsqueda de sitios web

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

Artículos relacionados