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