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:
P2: Para omitir todos los valores en la secuencia y emitir un valor al finalizar
concat(
source$.pipe(ignoreElements()),
of(true)
)
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.