Necesito crear una suscripción a una Observable
que se elimine de inmediato 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.
observable.pipe(first()).subscribe(func)
dóndefirst
vienerxjs/operators
.RxJS tiene la mejor documentación que he encontrado. Seguir el siguiente enlace lo llevará a casos de uso de mapeo de tablas extremadamente útiles para los operadores. Por ejemplo, bajo el "yo quiero tomar el primer valor" caso de uso son tres operadores:
first
,firstOrDefault
, ysample
.Tenga en cuenta que si una secuencia observable se completa sin notificaciones, el
first
operador notifica a los suscriptores con un error, mientras que elfirstOrDefault
operador proporciona un valor predeterminado a los suscriptores.búsqueda de casos de uso del operador
fuente
Si desea llamar a un Observable solo una vez, significa que no va a esperar una transmisión de él. Por lo tanto, usar en
toPromise()
lugar desubscribe()
sería suficiente en su caso, yatoPromise()
que no necesita darse de baja.fuente
await
lopromise
que lo hace únicoPara complementar la respuesta de @ Brandon , el uso
first()
o similar también es esencial para actualizar un enBehaviorSubject
función de suObservable
. Por ejemplo (no probado):fuente
Versión limpia y conveniente
Ampliando la asombrosa respuesta de M Fuat NUROĞLU para convertir lo observable en una promesa, aquí está la versión muy conveniente.
¡Lo bueno de esto es que podemos usar ese valor como una variable normal sin introducir otro bloque anidado!
Esto es especialmente útil cuando necesita obtener múltiples valores de múltiples observables. Limpio y ordenado.
Por supuesto, tendrá que hacer que su función de contención
async
vaya a esta ruta. También puede hacer.then
la promesa si no desea que la función que contiene sea asíncronaNo estoy seguro de si hay compensaciones con este enfoque, no dude en hacérmelo saber en los comentarios para que estemos al tanto.
PD: si te gustó esta respuesta, no olvides votar la respuesta de M Fuat NUROĞLU también :)
fuente
Tuve una pregunta similar.
A continuación fue llamado incluso más tarde por diferentes cambiadores de estado. Como no quise.
Decidí probar
unsubscribe()
después de suscribirme como a continuación.subscribe(func).unsubscribe();
es comosubscribeOnce(func)
.Espero que eso también te haya ayudado.
fuente