¿Podemos regresar de una solicitud de llamada de función expresa antes de que se complete una promesa dentro de la función?
Para ser más precisos, tengo una ruta que cuando se llama hará una inserción en la base de datos. Estoy usando typeorm como la biblioteca ORM para ayudar con esto. Ahora, para que la aplicación sea más rápida, me gustaría devolver la solicitud al cliente incluso antes de que finalice la promesa.
He proporcionado un ejemplo mínimo en el bloque de código a continuación.
app.get('/', (req, res) => { const user = new User(); user.firstName = "Timber"; user.lastName = "Saw"; user.age = 25; // There is no await here. This is an asynchronous process. repository.save(user); res.send('Hello World!') }) Sé que este objeto User se guardará de todos modos. Sin embargo, estoy más preocupado por cualquier problema potencial con Node & Express si se hace de esta manera, como una pérdida de memoria.
Información adicional: si por alguna razón hay un error al guardar, está bien si los datos no se escriben.
La llamada asíncrona se colocará en el bucle de eventos del nodo como cualquier otra llamada y se resolverá cuando pueda, como pudo observar en su aplicación. No debería haber ninguna preocupación por una pérdida de memoria, ya que así es como deben funcionar las llamadas asincrónicas.
El principal inconveniente es que está devolviendo un código de estado de éxito al usuario sin saber realmente que es un éxito y la eventual consistencia que experimentará el usuario. Si está de acuerdo con eso, entonces no hay razón para no 'regresar' temprano.
Puede usar la promesa de enviar una respuesta (la parte de entrega de errores se menciona en https://expressjs.com/en/guide/error-handling.html )
ejemplo:
app.get('/', (req, res, next) => { const user = new User(); user.firstName = "Timber"; user.lastName = "Saw"; user.age = 25; repository.save(user) .then((_) => { res.send('Hello World!') }) .catch((err) => { next(err) }) })