Solución:
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 () con last ()
skipUntil: ignora los elementos emitidos hasta que otro observable haya emitido
último: emite el último valor de una secuencia (es decir, espere hasta que se complete y luego emita)
Tenga en cuenta que cualquier cosa emitida por el observable pasó 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 se equivocará si no se emite nada. los last()
el operador tiene un default
parámetro, pero solo cuando se usa junto con un predicado. Creo que si esta situación es un problema para ti (si sequence2$
puede completarse sin emitir), entonces uno de estos debería funcionar (actualmente no probado):
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 tener cualquier valor. También tenga en cuenta que esta es la tubería adjunta a sequence2$
y no el main$
tubo.