la función de wait se usa como una función de suspensión, la función fn toma una matriz (elementos), registra cada elemento y duerme por un segundo antes de registrar el siguiente elemento.
const wait = async(time) => { return new Promise((resolve) => setTimeout(resolve, time)) } const fn = async(items) => { for (item of items) { await wait(1000) console.log(item) } } const exeAll = async() => { Promise.all([ fn(['A1', 'A2']), fn(['B1', 'B2']), ]) } exeAll() El problema es el resultado proporcionado por la función exeAll que imprime:
B1 A2 B2 B2Pero creo que debería imprimir algo como:
A1 B1 A2 B2A1 no se muestra en absoluto cuando se ejecuta el código anterior. ¿Alguien puede explicar por qué?
for (item of items) { creará un item de variable global implícito, es decir, múltiples llamadas a fn interferirán entre sí, sobrescribiendo item . Declare correctamente la variable y funciona como se esperaba:
const wait = async(time) => { return new Promise((resolve) => setTimeout(resolve, time)) } const fn = async(items) => { for (let item of items) { // ^^^^ await wait(1000) console.log(item) } } const exeAll = async() => { Promise.all([ fn(['A1', 'A2']), fn(['B1', 'B2']), ]) } exeAll() Podemos agregar más registros a fn para ver qué sucede cuando en su caso:
const wait = async(time) => { return new Promise((resolve) => setTimeout(resolve, time)) } let counter = 0; const fn = async(items) => { const c = counter++; console.log(`enter fn call #${c}`); for (item of items) { console.log(`fn call #${c} sets item <-`, item); await wait(1000) console.log(`fn call #${c} reads item ->`, item); console.log(item) } } const exeAll = async() => { Promise.all([ fn(['A1', 'A2']), fn(['B1', 'B2']), ]) } exeAll() El modo estricto ( "use strict"; ) habría detectado ese error porque la asignación a una variable no declarada genera un error.