Выполнение "сна" внутри асинхронной итерации "для ожидания" (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).

Другие вопросы по тегам