Crear suscripción única
Necesito crear una suscripción a una Observable
que se elimine inmediatamente cuando se llame por primera vez.
¿Hay algo como:
observable.subscribeOnce(func);
Mi caso de uso: estoy creando una suscripción en un controlador de ruta rápida y la suscripción se llama varias veces por solicitud.
No estoy 100% seguro de lo que necesita, pero si solo desea observar el primer valor, utilice first()
o take(1)
:
observable.first().subscribe(func);
nota: .take(1)
y .first()
ambos se dan de baja automáticamente cuando se cumple su condición
Actualización desde RxJS 5.5+
Del comentario de Coderer .
import { first } from 'rxjs/operators'
observable
.pipe(first())
.subscribe(func);
Este es el por qué
RxJS tiene la mejor documentación que he encontrado. Si sigue el siguiente enlace accederá a una tabla sumamente útil que asigna casos de uso a los operadores. Por ejemplo, en el caso de uso "Quiero tomar el primer valor" hay tres operadores: first
, firstOrDefault
y sample
.
Tenga en cuenta que si una secuencia observable se completa sin notificaciones, el first
operador notifica a los suscriptores un error mientras firstOrDefault
proporciona un valor predeterminado a los suscriptores.
búsqueda de casos de uso del operador
ACTUALIZACIÓN (DICIEMBRE/2021):
Como toPromise()
la función ha quedado obsoleta en RxJS 7, se ha anunciado que se utilizarán nuevas funciones en su lugar. firstValueFrom
y lastValueFrom
.
firsValueFrom
La función resuelve el primer valor emitido y cancela la suscripción directamente al recurso. Rechaza con un EmptyError cuando el Observable se completa sin emitir ningún valor.
Por otro lado, lastValueFrom
la función es, hasta cierto punto, igual que toPromise()
resuelve el último valor emitido cuando se completa el observable. Sin embargo, si el observable no emite ningún valor, lo rechazará con un EmptyError . A diferencia toPromise()
de los cuales se resuelven undefined
cuando no se emite ningún valor.
Para obtener más información, consulte los documentos .
Antigua respuesta:
Si desea llamar a un Observable solo una vez, significa que no va a esperar una transmisión desde él. Entonces, usar toPromise()
en lugar de subscribe()
sería suficiente en su caso, ya que toPromise()
no es necesario cancelar la suscripción.