Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

1.2K
Vistas
¿Cómo hacer que una secuencia Observable espere a que otra se complete antes de emitir?

Digamos que tengo un Observable , así:

 var one = someObservable.take(1); one.subscribe(function(){ /* do something */ });

Entonces, tengo un segundo Observable :

 var two = someOtherObservable.take(1);

Ahora, quiero subscribe() a two , pero quiero asegurarme de que one se haya completado antes de que se despida a los two suscriptores.

¿Qué tipo de método de almacenamiento en búfer puedo usar en two para hacer que el segundo espere a que se complete el primero?

Supongo que estoy buscando pausar two hasta one esté completo.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Un par de formas en las que puedo pensar

 import {take, publish} from 'rxjs/operators' import {concat} from 'rxjs' //Method one var one = someObservable.pipe(take(1)); var two = someOtherObservable.pipe(take(1)); concat(one, two).subscribe(function() {/*do something */}); //Method two, if they need to be separate for some reason var one = someObservable.pipe(take(1)); var two = someOtherObservable.pipe(take(1), publish()); two.subscribe(function(){/*do something */}); one.subscribe(function(){/*do something */}, null, two.connect.bind(two));
over 4 years ago · Santiago Trujillo Denunciar

0

Si desea asegurarse de que se mantenga el orden de ejecución, puede usar flatMap como el siguiente ejemplo

 const first = Rx.Observable.of(1).delay(1000).do(i => console.log(i)); const second = Rx.Observable.of(11).delay(500).do(i => console.log(i)); const third = Rx.Observable.of(111).do(i => console.log(i)); first .flatMap(() => second) .flatMap(() => third) .subscribe(()=> console.log('finished'));

El resultado sería:

 "1" "11" "111" "finished"
over 4 years ago · Santiago Trujillo Denunciar

0

saltarHasta() con último()

skipUntil: ignora los elementos emitidos hasta que se haya emitido otro observable

último: emite el último valor de una secuencia (es decir, espera hasta que se complete y luego emite)

Tenga en cuenta que cualquier cosa emitida desde el observable pasado a skipUntil cancelará la omisión, por lo que debemos agregar last() - para esperar a que se complete la transmisión.

 main$.skipUntil(sequence2$.pipe(last()))

Oficial: https://rxjs-dev.firebaseapp.com/api/operators/skipUntil


Posible problema: tenga en cuenta que last() por sí mismo generará un error si no se emite nada. El operador last() tiene un parámetro default , pero solo cuando se usa junto con un predicado. Creo que si esta situación es un problema para usted (si sequence2$ puede completarse sin emitir), entonces uno de estos debería funcionar (actualmente sin probar):

 main$.skipUntil(sequence2$.pipe(defaultIfEmpty(undefined), last())) main$.skipUntil(sequence2$.pipe(last(), catchError(() => of(undefined))

Tenga en cuenta que undefined es un elemento válido para ser emitido, pero en realidad podría ser cualquier valor. También tenga en cuenta que esta es la tubería adjunta a la sequence2$ y no la tubería main$ .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda