Supongamos que tengo un punto final /print . Cada vez que se realiza una solicitud a este punto final, ejecuta una función printSomething() . Mientras se printSomething() , si el usuario u otro usuario llega a este punto final, se ejecutará printSomething() nuevamente. Si esto ocurre varias veces, el método se ejecutará varias veces en paralelo.
app.get('/print', (req, res) => { printSomething(someArguments); res.send('processing receipts'); }); El problema con el comportamiento predeterminado es que, dentro de printSomething() , creo algunos archivos locales que son necesarios durante la ejecución de printSomething() y cuando se realiza otra llamada a printSomething() , anulará esos archivos, por lo tanto, ninguna de las llamadas devolver el resultado deseado.
Lo que quiero hacer es asegurarme de que se complete la ejecución de printSomething( printSomething() , antes de que se inicie otra ejecución de printSomething() . o para detener la ejecución actual de printSomething() una vez que se realiza una nueva solicitud al punto final.
Tiene diferentes opciones según lo que necesite, la cantidad de solicitudes que espera recibir y lo que hace con los archivos que está creando.
Solución 1
Si espera poco tráfico en este punto final
puede agregar una clave única a algunos someArguments según su requerimiento o generarlos aleatoriamente y crear los archivos que necesita en un directorio diferente
Solución 2
Si cree que causará algún problema de rendimiento, debe crear algún tipo de cola y trabajador para manejar las tareas.
De esta manera, puede manejar cuántas tareas se pueden ejecutar simultáneamente
Si está creando un sistema REST con llamadas distribuidas, esto suena problemático. Por lo general, no desea que una solicitud bloquee otra. Si el orden de operación es crucial (FIFO), entonces parece un problema de cola de clasificación.
Hay muchas formas diferentes de implementar la cola, puede usar una matriz o algo así o implementar una clase única que extienda eventEmitter.
const myQueue = new Q() const crypto = require('crypto'); const route = (req,res) => { const uniqeID =crypto.randomUUID() myQueue.once(uniqeID, (data) =>{ res.send(data) }) myQueue.process(uniqID, req.someDaTa) }Podría usar app.locals , como sugieren los documentos : Once set, the value of app.locals properties persist throughout the life of the application .
Necesitas usar req.app.locals , algo como
req.app.locals.isPrinting = true; ---- //Then check it if (req.app.locals.isPrinting) req.app.locals es la forma en que express lo ayuda a acceder a app.locals