child_process.stdout.on ('data', cb) группирует журналы в одно событие - PullRequest
0 голосов
/ 30 октября 2018

Это просто демо, а не мой настоящий код ...
При необходимости я могу прикрепить свой реальный код.

У меня есть скриптA , который выводит логи через: process.stdout.write.
Затем я хочу получить каждый журнал от родителя scriptB с:

const cp = child_process.spawn('node', ['scriptA.js']);
cp.stdout.on('data', (data) => {
   console.log(data.toString() + '\n');
});

который должен вывести:

line a 

line b

line c

Но некоторые строки объединяются в одну (если они выводятся за короткий промежуток времени) :

line a
line b

line c

Я пытался использовать тайм-ауты в child_process, но, конечно, он просто задерживает их все. Я также пытался использовать случайные таймауты, но это тоже не сработало, так как это просто испортило порядок журналов.

Кто-нибудь знает, есть ли способ решить эту проблему?

EDIT: Я только что подумал о разделении журнала на родительском и отправке журналов построчно, если присутствует более одного:

cp.stdout.on('data', (data) => {
  let logs = data.toString().split('\n').filter(x => x);
  logs.forEach(el => {
    console.log(`${el}\n\n`)
  });
});

Это делает то, что я хочу, но я не думаю, что это лучший подход ... Любой совет поможет!

1 Ответ

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

Для этого можно использовать модуль readline из стандартной библиотеки.

const readline = require('readline');
const child_process = require('child_process');

const cp = child_process.spawn('node', ['scriptA.js']);
const reader = readline.createInterface({ input: cp.stdout })
reader.on('line', (line) => {
  console.log(line);
});

Существует опция crlfDelay, которую вам, возможно, придется настроить, что задокументировано в readline.createInterface()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...