Порождение Node.js: console.log не регистрируется дважды, а process.stdin.on('data',callback) не выполняется

У меня есть три вопроса о коде ниже. Во-первых, почему строка A не отображается на выходе в терминале. Прямо сейчас кажется, что строка B регистрируется, а строка A - нет. Во-вторых, до отметки 4000 миллисекунд я пытался что-то набрать на клавиатуре и ожидал, что кусок кода на C завершит процесс. Однако он продолжал записывать строки, пока не достиг 4 секунд. Когда я пытался запустить alwaysTalking.js сам по себе, мое прерывание клавиатуры фактически завершало программу. Почему здесь не получится? Наконец, что делает линия D? Он передает функцию spawn переменной spawn? Является ли var spawn объектом функции/класса spawn?

Любая помощь будет принята с благодарностью!

AlwaysTalking.js:

var sayings = [
"You may delay, but time will not.",
"Tell me and I forget. Teach me and I remember. Involve me and I learn.",
"It takes many good deeds to build a good reputation, and only one bad one to lose it.",
"Early to bed and early to rise makes a man healthy, wealthy and wise.",
"By failing to prepare, you are preparing to fail.",
"An investment in knowledge pays the best interest.",
"Well done is better than well said."
];

var interval = setInterval(function() {
var i = Math.floor(Math.random() * sayings.length);
console.log(` ${sayings[i]} \n`);       //line A
}, 1000);

process.stdin.on('data', function(data) {                          //C
console.log(`STDIN Data Recieved -> ${data.toString().trim()}`);   //C
clearInterval(interval);                                           //C
process.exit();                                                    //C
});                                                                //C

spawn.js:

var spawn = require("child_process").spawn;           //line D
var cp = spawn("node", ["alwaysTalking"]);

cp.stdout.on("data", function(data) {
console.log(`STDOUT: ${data.toString()}`);   //line B
});

cp.on("close", function() {
console.log("Child Process has ended");
process.exit();
});
setTimeout(function() {
cp.stdin.write("stop");
}, 4000);

На терминале:

$node spawn
STDOUT: abcde You may delay, but time will not. 


STDOUT: abcde Tell me and I forget. Teach me and I remember. Involve me and I learn. 


STDOUT: abcde By failing to prepare, you are preparing to fail. 


STDOUT: STDIN Data Recieved -> stop

Child Process has ended

person varimax    schedule 13.03.2016    source источник


Ответы (1)


Вы не передаете стандартный ввод дочернему процессу. Вам нужно будет:

process.stdin.pipe(cp.stdin);
person Abex    schedule 13.03.2016
comment
Не могли бы вы объяснить, что эта штука делает? - person varimax; 13.03.2016
comment
Он просто копирует (направляет) любой ввод из родительского стандартного ввода в дочерний стандартный ввод, в противном случае родитель сохраняет свой стандартный ввод и дочерний стандартный вывод отдельно. - person Abex; 13.03.2016