Последовательное выполнение асинхронных вызовов в Node.js - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь запустить асинхронные функции Node.js в цикле. Каждая функция выполняет вызов API и записывает ответ в консоль и в файл. Проблема в том, что журналы записываются только после того, как все вызовы закончили выполнение, и я хотел бы, чтобы выходные данные регистрировались последовательно.

Вот код:

const checkBatch = async function () {
  const MAX_BATCH = 20;
  for (let i = 0; i < MAX_BATCH; i++) {
    await apiCallAndLog();
  }
};


const q = async.queue((task, cb) => { console.log(`${task.name} processed`); cb(); });
for (let i = 0; i < MAX_CHECKS; i++) {
  q.push({ name: 'batch' + i }, checkBatch);
}

IsМожно ли исправить это так, чтобы выходные данные регистрировались последовательно, а не после завершения всех пакетов? Я пробовал простые циклы и асинхронную очередь (как в этом примере).

1 Ответ

0 голосов
/ 20 октября 2019

Вы должны использовать checkBatch в качестве рабочего очереди, а не в качестве обратного вызова для отдельного элемента:

const q = async.queue((task, cb) => {
  checkBatch(task).then(res => cb(null, res), err => cb(err));
});
for (let i = 0; i < MAX_CHECKS; i++) {
  q.push({ name: 'batch' + i }, (err, res) => console.log(`batch${i} processed`);}););
}

Однако async.js не очень хорошо согласуется с обещаниями, как вы можетевидите, вам лучше выбрать библиотеку очередей с поддержкой обещаний.

Или полностью отказаться от потребности в очереди и просто написать

for (let i = 0; i < MAX_CHECKS; i++) {
  await checkBatch({ name: 'batch' + i });
  console.log(`batch${i} processed`);
}
...