Buenos días.
Estoy trabajando en un proyecto expreso y no he podido comprender completamente cómo funcionan las funciones asíncronas y las promesas. Esta es la estructura de mi proyecto.
-controladores --userController.js -servicios --pagoService.js
El servicio de pago es la implementación de una herramienta de pago de terceros y define un método que estoy usando como este
const pay = async(data) => { service.pay() .then(function(response){ return response; }).catch(function(err)){ console.log(err); }); }estoy llamando a este método desde mi controlador de usuario
let payUser = async(req, res) => { const response = await paymentService.pay(req.data); if(response) { res.send(response) } }pero la respuesta siempre está indefinida, no espera como pensé que debería hacerlo debido a la palabra clave "esperar".
¿Cómo funciona esto exactamente? ¿Qué estoy haciendo mal si quiero que espere hasta que se devuelva la respuesta?
Hay un problema en su código para la función de pay :
const pay = async(data) => { service.pay() .then(function(response){ return response; }).catch(function(err)){ console.log(err); }); } No devuelves nada. Simplemente ejecuta service.pay() . Por lo tanto, la firma de la función pay (declarada en la primera línea) es una función que devuelve una promesa, pero el tipo de devolución es Promise<void> , no Promise<YourData> . Esto hace que siempre devuelva undefined , incluso cuando se llama con await , como en su código de ejemplo completo.
Veo que tienes la return response; dentro de la devolución de llamada "entonces". Esto puede significar que tenía la intención de que esos datos se devolvieran a la persona que llama de pay (no a service.pay ) cuando los datos estuvieran listos. Para hacer esto, debe reescribir su función de pay de una de dos maneras:
service.pay ... con return service.pay ... para que la promesa devuelta por service.pay se devuelva realmente a la persona que llama de pay .service.pay ... con return await service.pay ... . Ya ha trabajado para diseñar pay como una función asíncrona, por lo que ahora puede usar await dentro de ella, lo que a menudo hace que este tipo de código sea más sencillo de escribir y leer más adelante.