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?
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.
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.