Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.2K
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!