• Empleos
  • Sobre nosotros
  • Empleos
    • Inicio
    • Empleos
    • Cursos y retos
  • Empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Contrata talento tech
    • Blog
    • Comercial
    • Calculadora de salario

0

1.1K
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.

about 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));
about 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"
about 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$ .

about 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 Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda