我使用异步迭代从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
}在“等待”的插话中“睡觉”的正确方式是什么?
发布于 2018-10-03 14:40:06
我想通了。问题是,我正在使用Jest执行代码。当我正常执行代码时,上面的代码工作得很好。多亏了诺塞雷肖的回答,我才把目光转向别处。我太专注于等待。
发布于 2018-10-03 12:15:21
您的代码似乎是正确的,我模拟了您的异步生成器如下:
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 (我使用的是10.11.0版本)。
https://stackoverflow.com/questions/52606687
复制相似问题