Búsqueda de sitios web

javascript - "Dormir" la ejecución dentro de la iteración asincrónica "for await" (ES2018)


Estoy usando iteración asincrónica para obtener elementos de DynamoDB. Para cada iteración (elemento) ejecuto algunas solicitudes HTTP. Necesito "dormir" 1 segundo en cada iteración para limitar el flujo de solicitudes. Intenté con promisify(setTimeout) pero la ejecución se detiene.

const sleep = require('util').promisify(setTimeout)

for await (const item of mapper.scan(MyDomainObject)) {

    await sleep(1000);   //This doesn't work
    // do some http requests
}

¿Cuál es la manera adecuada de "dormir" dentro de una iteración "for await"?

Respuesta #1

Lo resolví. El problema era que estaba ejecutando el código con Jest. Cuando ejecuté el código normalmente, el código anterior funciona perfectamente. Gracias a la respuesta de Noseratio, busqué en otro lado. Estaba demasiado concentrado en el for await.

Respuesta #2

Tu código parece estar correcto, he simulado tu generador asincrónico así:

const sleep = require('util').promisify(setTimeout);

async function* scan(arg) {
  for (let i = 0; i < 4; i++) {
    console.log(`yielding ${i}`);
    await sleep(500);
    yield i;
  }
}

async function test()
{
  for await (let item of scan({})) {
    console.log(`got ${await item}`);
    await sleep(1000);
  }
}

test();

La ejecución no se detiene para mí, sin importar cuántas iteraciones provisiono dentro de scan.

Por lo tanto, no es el sleep lo que está causando el problema, deberías buscar en otro lugar. Quizás el problema esté con mapper.scan, o con esas solicitudes http, o tal vez solo necesites actualizar tu node.js (yo estoy en la v10.11.0).