Tengo la siguiente configuración:
async MyFunction(param) { //... Do some computation await WriteToDB() } io.on('connection', (socket) => { socket.on('AnEvent', (param) => MyFunction(param)) })Cuando llega un evento, llama a una función asíncrona que realiza algunos cálculos y, al final, escribe el resultado en una base de datos con otra llamada asíncrona.
Si MyFunction no tiene una llamada asíncrona para escribir la base de datos al final, por ejemplo
MyFunction(param) { //... Do some computation } entonces es obvio que todos los eventos se procesarán en su orden de entrada. El procesamiento del siguiente evento solo comenzará después de que finalice el procesamiento del anterior. Sin embargo, debido a la llamada asíncrona a la base de datos, no sé si esos eventos entrantes aún se procesarán por completo en orden. Me temo que el procesamiento del siguiente evento comienza antes de que finalice la await WriteToDB() . ¿Cómo cambio el código para procesarlos completamente en orden?
Tiene razón en que no hay garantía de que los eventos entrantes se procesarán en el pedido.
Para lograr lo que está pidiendo, necesitaría una "Cola de mensajes" que verificará periódicamente si hay nuevos mensajes y los procesará uno por uno.
const messageQueue = []; // SocketIO adding Message to MessageQueue const eventHandler = (message) => { messageQueue.push(message); } const messageHandler = () => { if (messageQueue.length === 0) { return; } const message = messageQueue.shift(); // Handle Message // If successful, ask for next message return messageHandler(); }Por supuesto, mi ejemplo es bastante ingenuo, pero espero que le dé una idea general de cómo se logra lo que está pidiendo.
Si necesita una cola de mensajes más robusta, consulte RabbitMQ, BullMQ, Kafka