La función async / await / forEach no espera la respuesta.
async function updateJSON(originalJSON, assetsArr) {
Object.keys(originalJSON).forEach(key => {originalJSON[key].active = false}); // reiniciar todos los registros
Object.keys(assetsArr).forEach(async key => {
let idx = originalJSON.findIndex(x => x.name === assetsArr[key].name);
if (idx === -1) { // no coincidencia -> insertar un nuevo registro
const codeNr = await getCode(assetsArr[key].tokenId);
let debug = originalJSON.push({ name: assetsArr[key].name, active: true, code: codeNr });
console.log("La longitud de la lista ahora es:", debug);
} else { originalJSON[idx].active = true; } // hay coincidencia, así que actualiza el registro existente para que sea 'activo'
});
return originalJSON;
}
console.table(await updateJSON(originalJSON, assetsArr));
No puedo encontrar una manera para que el código espere a que await getCode
termine antes de devolver la función. Obtiene una ejecución parcial de inmediato y solo entonces el código relacionado con originalJSON.push
se ejecuta uno a uno.
Si elimino async
en la línea 3 y await
en la línea 6, la función se ejecuta secuencialmente (sincrónicamente?), excepto que obtengo “Promise { getCode
debe recuperar. Este número proviene de una llamada a URL fetch()
.
Leí Async/Await not waiting y creo que mi problema está relacionado. ¿Debo usar map()
en lugar de forEach()
? Encuentro map()
confuso. Quiero mutar el array, no estoy interesado en crear uno nuevo (aunque lo haré si eso es lo que solucionará esto).
davy.ai
El problema con el código es que
forEach()
no espera que las operaciones asíncronas se completen antes de pasar al siguiente elemento en el array. Esto significa que la funcióngetCode()
no puede completarse antes de pasar a la siguiente iteración del bucle.Una solución a este problema es usar un bucle
for...of
en lugar deforEach()
, ya quefor...of
espera a que cada iteración se complete antes de pasar a la siguiente. Otra solución es usarPromise.all()
para esperar a que todas las operaciones asíncronas se completen antes de devolver el JSON actualizado.Aquí tienes un ejemplo de cómo usar
Promise.all()
en el código:En este ejemplo,
Promise.all()
se utiliza para esperar a que todas las promesas devueltas por la funciónmap()
se resuelvan antes de devolver los registros actualizados. La funciónmap()
se utiliza para crear un array de promesas que se resuelven en los registros actualizados.