Использование execSync внутри обещания задерживает асинхронный код - PullRequest
0 голосов
/ 14 ноября 2018

Я пишу скрипт nodejs для обработки (преобразования в PDF из различных форматов) большого количества файлов на регулярной основе.Сценарий считывает все файлы в папке, разбивает их на массивы одинакового размера и затем должен асинхронно запускать конвертер командной строки для каждого из массивов.Все работает отлично, за исключением узла, ожидающего возврата обещания, прежде чем продолжить цикл for.Код использует тестовую команду для копирования файлов вместо преобразования, потому что это проще для тестирования.Вместо того, чтобы запускать 5 одновременных задач копирования, он запускается одна за другой.Я использую массив обещаний, поэтому я могу вызвать Promises.all(), когда все обещания возвращаются.Чего мне не хватает, что это не работает как надо?

let processCount = 5;
let promisesArray = [];
for (let processNo = 0; processNo < processCount; processNo++) {
  promisesArray[processNo] = new Promise(function(resolve, reject) {
    let fileList = splitArrays[processNo];
    for (let file = 0; file < fileList.length; file++) {
      let command = `Copy "${fileList[file][0]}"  "${fileList[file][1]}"`;
      execSync(command);
    }
    resolve(true);
  });
}

1 Ответ

0 голосов
/ 14 ноября 2018

execSync() по определению блокирует цикл обработки событий до завершения дочернего процесса.Вам придется использовать exec() вместо этого.Третий параметр exec() - это функция обратного вызова, которая будет вызываться при выходе из дочернего процесса.

...