"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 的回答,我在别处看了看。我太专注于等待了。
我正在使用异步迭代从 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 的回答,我在别处看了看。我太专注于等待了。