Saltar al contenido

Cómo combinar las llamadas de observables de mergeMap y devolver solo un valor para todo el observable

Nuestros programadores estrellas agotaron sus reservas de café, en su búsqueda noche y día por la resolución, hasta que Rubén halló el arreglo en Gogs y ahora la compartimos aquí.

Solución:

Para obtener el resultado combinado de todas las respuestas de mergeMap, también puede probar así:

return this.request1().pipe(
  mergeMap(res1=> this.request2(res1.id).pipe(
    map(res2=> 
      return 
        res1: res1,
        res2: res2
      
    )
  ))
)

Q1: Tu necesitas un toArray – combinará todos los valores de tu flujo en uno array:

ejemplo de matriz

P2: Para omitir todos los valores en la secuencia y emitir un valor al finalizar

concat(
  source$.pipe(ignoreElements()),
  of(true)
)

emitir un valor al completar la fuente

Ver “Emitir un valor al completar la fuenteejemplo en un patio de recreo

Aquí hay un ejemplo anotado para ayudar a aclarar sus preguntas sobre el proceso de suscripción sobre el que pregunta.

Q1:

Como se señaló en otra respuesta, el reduce operador es lo que querrá incluir en su source tubería. A key detalle con reduce es que sólo emite al finalizar el observable de la fuente correspondiente. Si, en cambio, desea la emisión a medida que se completan esos observables internos, entonces scan es apropiado. Otra diferencia con este último es que no requiere completar la fuente.

P2:

Con esta pregunta, consulte mi ejemplo a continuación y piense en cada argumento de la canalización de procesamiento como el tiempo de vida de una sola solicitud. Aquí, la finalización está implícita. Ocurre después de que se procesa el último valor de los observables internos.

Sin embargo, si no hay un límite para los observables internos, entonces no es posible saber cuándo están completos todos los observables internos. En tal caso, encontrará que reduce() no funcionará

const  from, of, Subject  = rxjs;
const  mergeMap, map, tap, reduce, scan  = rxjs.operators;

// Use a subject to simulate processing.
// Think of each argument as a request to the processing pipeline below.
const properties = new Subject();

// Establish processing pipeline
const source = properties.pipe(
  // `mergeMap` here flattens the output value to the combined inner output values
  mergeMap(props =>
    // Each item inside the argument should be piped as separate values
    from(props).pipe(
      // `mergeMap` here flattens the output value to ` key, value `
      mergeMap(key =>
        of('test').pipe(
          map(value => ( key, value )),
        ),
      ),
      // Unlike `scan`, `reduce` only emits upon "completion".
      // Here, "completion" is implicit - it is after the last
      // element of `from(props)` has been processed.
      reduce((a, i) => [...a, i], []),
    )
  ),  
);

// Subscribe to the pipeline to observe processing.
source.subscribe(console.log);

// Trigger a processing request with an argument
properties.next(['session', 'user']);

// Trigger another processing request
properties.next(['session', 'user']);

valoraciones y comentarios

Si te ha resultado provechoso este post, agradeceríamos que lo compartas con el resto desarrolladores de esta manera nos ayudas a difundir nuestro contenido.

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



Utiliza Nuestro Buscador

Deja una respuesta

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