Saltar al contenido

¿Cómo hacer que una secuencia observable espere a que se complete otra antes de emitirse?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *