Выполнение "сна" внутри асинхронной итерации "для ожидания" (ES2018)
Я использую асинхронную итерацию для получения элементов из 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
}
Как правильно "спать" внутри "ждать"?
2 ответа
Я понял. Проблема была в том, что я выполнял код с Jest. Когда я выполняю код нормально, приведенный выше код работает отлично. Благодаря ответу Noseratio я посмотрел в другом месте. Я был слишком сосредоточен на ожидании.
Ваш код кажется правильным, я смоделировал ваш асинхронный генератор следующим образом:
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).