async function updateJSON(original_JSON, assets_arr) { Object.keys(original_JSON).forEach(key => {original_JSON[key].active = false}); // reset all records Object.keys(assets_arr).forEach(async key => { let idx = original_JSON.findIndex(x => x.name === assets_arr[key].name); if (idx === -1) { // no match -> insert a new record const code_nr = await getCode(assets_arr[key].token_id); let debug = original_JSON.push({ name: assets_arr[key].name, active: true, code: code_nr }); console.log("List len now:", debug); } else { original_JSON[idx].active = true; } // there is a match, so just update existing record to become 'active' }); return original_JSON; } console.table(await updateJSON(original_JSON, assets_arr)); No puedo encontrar una manera para que el código espere a que finalice await getcode antes de devolver la función. Obtengo una ejecución parcial de inmediato y solo entonces el código relacionado con original_JSON.push se ejecuta un registro a la vez.
Si async de la línea 3 y await de la línea 6, la función se ejecuta secuencialmente (¿sincrónicamente?), excepto que obtengo "Promise { }" en lugar del número de código que se supone que debe recuperar la función getCode . Este número proviene de una URL fetch() .
Leí Async/Await sin esperar y creo que mi problema está relacionado. ¿Necesito usar map() en lugar de forEach() ? Encuentro map() confuso. Quiero mutar la matriz, no estoy interesado en hacer una nueva (aunque lo haré si eso es lo que solucionará esto).
Obtuve la solución de Nodejs. La función forEach no espera funciones asíncronas : reemplazar el async forEach con un bucle for soluciona el problema. Un bucle while también debería funcionar. ¡Estos sofisticados métodos de bucle hacen tropezar a la gente cuando los simples funcionan mejor!
async function updateJSON(original_JSON, assets_arr) { Object.keys(original_JSON).forEach(key => {original_JSON[key].active = false}); // reset all records for (const key in assets_arr) { let idx = original_JSON.findIndex(x => x.name === assets_arr[key].name); if (idx === -1) { // no match -> insert a new record const code_nr = await getCode(assets_arr[key].token_id); let debug = original_JSON.push({ name: assets_arr[key].name, active: true, code: code_nr }); console.log("List len now:", debug); } else { original_JSON[idx].active = true; } // there is a match, so just update existing record to become 'active' }; return original_JSON; } console.table(await updateJSON(original_JSON, assets_arr));