Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

150
Vistas
completa la matriz dinámica observables uno por uno (concatMap)

Estoy creando una aplicación de chat y me gustaría guardar los mensajes en el orden correcto.

Imagínese, tendría un número estático de mensajes

 // 4 messages. array of static length: 4 chatMessages: string[] = ['hello', 'world', 'and', 'stack overflow members']; //

ahora, vamos a crear observables guardados para ellos.

 chatMessages: Observable<ChatMessage>[] = chatMessages.map((message: string) => { return chatService.saveMessage(message); // returns an Observable to call API })

Ahora, quiero salvarlos uno por uno, uno tras otro.

lo hago de esta manera:

 from(chatMessages).pipe( concatMap((observable) => observable), toArray(), take(1) ).subscribe();

Ahora mi pregunta es si la matriz inicial de chatMessages es dinámica (se puede agregar un mensaje en cualquier momento, incluso durante el guardado). ¿Cómo hago un bucle en la matriz para guardar los mensajes de chat uno por uno, manteniendo el orden en que se agregaron?

Por ejemplo: dos de los cuatro mensajes se guardaron, el tercero se está procesando y, en ese momento, el quinto mensaje se agrega a la matriz chatMessages. ¿Cómo manejo eso?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Si entiendo bien el problema, debe lidiar con una matriz que puede recibir elementos adicionales con el tiempo y dichos elementos deben agregarse al final de la matriz.

Esto se puede ver como una secuencia de mensajes, los que originalmente se almacenaron en la matriz son los primeros elementos de la secuencia, a los que es posible agregar otros mensajes con el tiempo, por ejemplo, llamando a una función específica addMessage(msg) .

El código para construir tal transmisión podría verse así

 const myInitialArray = ['hello', 'world', 'and', 'stack overflow members'] function saveMessage(msg: string) { return of(`saved: ${msg}`).pipe(delay(1000)) } const add$ = new Subject<string>() const myStream = merge(from(myInitialArray), add$).pipe( concatMap(msg => saveMessage(msg)) )

Ahora lo que tienes que hacer es subscribe a myStream y, cada vez que quieras agregar un mensaje al final de la matriz (o flujo), debes llamar a la función addMessage .

Este stackblitz muestra el ejemplo funcionando.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si la matriz de chatMessages inicial es dinámica (se puede agregar un mensaje en cualquier momento, incluso durante el guardado)

¡Está describiendo un Observable de Mensaje (cadena), no una matriz! Dado que está procesando elementos uno a la vez, no es necesario un arreglo.

Simplemente puede usar un asunto simple que emite mensajes a medida que se reciben y tener una suscripción a esa transmisión que guarda los mensajes para usted:

 chatMessage$ = new Subject<string>(); function saveMessage(message: string) { chatMessage$.next(message); } chatMessage$.pipe( concatMap(message => chatService.saveMessage(message)) ).subscribe();

Esto procesará los nuevos mensajes uno a la vez, en el orden correcto.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda