"Sleep" 在异步迭代中执行 "for await" (ES2018)

"Sleep" execution inside asynchronous iteration "for await" (ES2018)

我正在使用异步迭代从 DynamoDB 获取项目。对于每次迭代(项目),我都会执行一些 http 请求。为了限制请求流,我需要在每次迭代中 "sleep" 1 秒。我尝试使用 promisify(setTimeout) 但执行停止了。

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
}

在 "for await" 交互中 "sleep" 的正确方法是什么?

您的代码似乎是正确的,我已经像这样模拟了您的异步生成器:

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();

无论我在 scan 中提供多少次迭代,我的执行都不会停止。

因此,导致问题的不是 sleep,您应该寻找其他地方。也许,问题出在 mapper.scan,或那些 http 请求,或者您可能只需要升级您的 node.js(我使用的是 v10.11.0)。

我想通了。问题是我用 Jest 执行代码。当我正常执行代码时,上面的代码完美运行。感谢 Noseratio 的回答,我在别处看了看。我太专注于等待了。