Tengo un código muy simple que estoy tratando de depurar. Tengo una función async :
async function updateResult(event){ let result = db.fetchResult(event.ProcessId); return result; } Y estoy llamando a esto desde otra función async simple:
exports.processEvent = async (event) => { try { let promises = []; const controls = await db.fetchControls(event.EventCode); if (controls) { promises = controls.map((control) => { console.log(control); control.map(x => this.updateResult(event)); }); } return Promise.allSettled(promises); } catch (err) { console.error(err); } }; El problema es que en exports.processEvent , el contenido de db.fetchControls(event.EventCode) se ejecuta hasta el final (algunas lógicas y una llamada a db getItem).
Pero la llamada a db.fetchResult(event.ProcessId) a través this.updateResult(x.Id, x.Version, event) NO completa la ejecución de las tareas de fetchResult (algunas otras lógicas son una llamada GET de db).
Siento que fetchResult regresa prematuramente. ¿Qué estoy haciendo mal?
.map() NO reconoce promesas. No espera a que se complete ninguna de las promesas en su devolución de llamada. Entonces, en este fragmento de código:
control.map(x => this.updateResult(x.Id, x.Version, event));Simplemente se ejecuta a través de toda la matriz ignorando todas las promesas que se devuelven y, por lo tanto, NADA espera esas promesas.
Puede arreglar eso devolviendo esas promesas al nivel superior .map() que luego está esperando con Promise.all() :
promises = controls.map((control) => { console.log(control); return Promise.all(control.map(x => this.updateResult(x.Id, x.Version, event))); });