await en un bucle, y otras trampas en JavaScript
forEach ignora async, y await dentro de un bucle serializa todo.
const double = async (n) => {
await new Promise((resolve) => setTimeout(resolve, 1));
return n * 2;
};
async function main() {
const collected = [];
[1, 2, 3].forEach(async (n) => collected.push(await double(n)));
console.log("forEach saw:", collected.length); // 0: nothing awaited
const sequential = [];
for (const n of [1, 2, 3]) {
sequential.push(await double(n));
}
console.log("for-of:", sequential);
const parallel = await Promise.all([1, 2, 3].map(double));
console.log("map + all:", parallel);
}
main();
Cómo funciona
forEachno espera: la promesa del callback se descarta.for...ofcon await es secuencial, que quizá es lo que quieres.mapmásPromise.alles la versión paralela.
Palabras clave y builtins usados aquí
Promiseasyncawaitconstdoubleforfunctionofreturn
El intento, en números
- Líneas
- 21
- Caracteres a escribir
- 516
- Tokens
- 160
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 96 segundos.
Paso 4 de 4 en async y await; paso 9 de 19 en Promesas y async.