Выполнение "сна" внутри асинхронной итерации "для ожидания" (ES2018) - PullRequest
0 голосов
/ 02 октября 2018

Я использую асинхронную итерацию для получения элементов из 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 ]

0 голосов
/ 03 октября 2018

Я понял это.Проблема заключалась в том, что я выполнял код с Jest .Когда я выполняю код нормально, приведенный выше код работает отлично.Благодаря ответу Noseratio я посмотрел в другом месте.Я был слишком сосредоточен на ожидании.

0 голосов
/ 03 октября 2018

Ваш код кажется правильным, я смоделировал ваш асинхронный генератор следующим образом:

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).

...