2

我正在使用异步迭代从 DynamoDB 获取项目。对于每次迭代(项目),我都会执行一些 http 请求。为了限制请求流,我需要在每次迭代中“休眠”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
}

在“等待”交互中“睡觉”的正确方法是什么?

4

2 回答 2

1

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

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

无论我为 inside 提供多少次迭代,执行都不会停止scan

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

于 2018-10-03T12:15:21.743 回答
1

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

于 2018-10-03T14:40:06.477 回答