Crear suscripción única

Resuelto Berkeley Martinez asked hace 9 años • 7 respuestas

Necesito crear una suscripción a una Observableque 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.

Berkeley Martinez avatar Jan 18 '15 13:01 Berkeley Martinez
Aceptado

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é

Brandon avatar Jan 19 '2015 17:01 Brandon

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, firstOrDefaulty sample.

Tenga en cuenta que si una secuencia observable se completa sin notificaciones, el firstoperador notifica a los suscriptores un error mientras firstOrDefaultproporciona un valor predeterminado a los suscriptores.

búsqueda de casos de uso del operador

DetweilerRyan avatar Mar 25 '2015 17:03 DetweilerRyan

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. firstValueFromy lastValueFrom.

firsValueFromLa 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, lastValueFromla 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 undefinedcuando 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.

M Fuat avatar Mar 09 '2020 07:03 M Fuat