Tengo un sitio web Express.js que utiliza socket.io . Por cada usuario (socket) que se conecta, se llama a una función que puede tardar mucho en resolverse.
servidor.js
const app = express(); const server = http.createServer(app); const io = new Server(server); io.on('connection', async (socket) => { console.log(`${socket.id}: socket connected`); console.log(`${socket.id}: computation started`); await longRunningTask(); console.log(`${socket.id}: computation completed`); socket.on('disconnect', () => { console.log(`${socket.id}: socket disconnected`); // TODO: Check if `longRunningTask` has resolved. If it has not, cancel it }); }); Este es el flujo actual del programa dado que un usuario se desconecta antes de que se resuelva longRunningTask :
El usuario visita el sitio web (se les asigna socket.id tCzH )
tCzH: socket connected tCzH: computation startedEl usuario se desconecta
tCzH: socket disconnectedpasa un tiempo
tCzH: computation completed Mi objetivo es finalizar longRunningTask inmediatamente dado que el socket está desconectado. ¿Cuál sería el mejor enfoque?
Desafortunadamente, es imposible terminar la ejecución de una función desde fuera de su alcance en Javascript. Incluso si envuelves tu longRunningTask en una Promesa y la rechazas manualmente, no evitará que se ejecute el resto de su pila.
La implementación de longRunningTask debe modificarse para que dependa de una variable global que se encuentra en el ámbito externo, y una vez que esta variable se vuelve, por ejemplo, falsa, debe regresar o interrumpirse desde adentro.