es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Espera las suscripciones asíncronas cuando emita el siguiente valor.

Tengo el siguiente ejemplo

import { Subject } from "rxjs";

const subject = new Subject();

subject.subscribe(() => new Promise(res => {
  setTimeout(() => console.log('!! 1'), 500);
}))

subject.subscribe(() => new Promise(res => {
  setTimeout(() => console.log('!! 2'), 1000);
}))

console.log('>>> START')
subject.next();
console.log('<<< FINISH')

La consola se ve así

>>> START
<<< FINISH
!! 1
!! 2

Quiero el siguiente comportamiento

>>> START
!! 1
!! 2
<<< FINISH

¿Puedo alcanzar el comportamiento esperado o debo usar otro enfoque?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr el comportamiento deseado, se debe utilizar el operador concat en lugar de subscribe para combinar los dos observables en secuencia. Aquí está un ejemplo actualizado:

    import { Subject, concat } from "rxjs";
    
    const subject1 = new Subject();
    const subject2 = new Subject();
    
    const obs1 = subject1.pipe(
      concat(new Promise(resolve => setTimeout(() => {
        console.log('!! 1');
        resolve();
      }, 500))))
    );
    
    const obs2 = subject2.pipe(
      concat(new Promise(resolve => setTimeout(() => {
        console.log('!! 2');
        resolve();
      }, 1000))))
    );
    
    console.log('>>> COMIENZO');
    concat(obs1, obs2).subscribe(() => {});
    subject1.next();
    subject2.next();
    console.log('<<< FINISH');
    
    

    Esto producirá el siguiente resultado:

    >>> COMIENZO
    !! 1
    !! 2
    <<< FINISH
    

    Aquí creamos dos sujetos separados, subject1y subject2, y luego definimos dos observables separados, obs1 y obs2. Cada observable se construye utilizando el operador concat para combinar el sujeto correspondiente con una Promesa que se resuelve después del retraso deseado.

    Luego usamos concat(obs1, obs2) para combinar los dos observables en secuencia, y nos suscribimos a este observable combinado con una función vacía para desencadenar la ejecución de los observables.

    Finalmente, llamamos a next () en ambos sujetos para desencadenar sus respectivos observables y emitimos <<< FINISH después de que las promesas se hayan resuelto.

Comments are closed.