Я новичок в node.js, и мне нужна небольшая помощь, чтобы иметь возможность получить некоторый синхронизированный «ответ» от порожденного процесса фонового соединения через соединение stdin / stdout.Мой пример кода работает нормально, но если вы проверите последние две строки, я всегда могу получить пустой буфер.Каким-то образом мне нужно синхронизировать эту часть кода с частью child.stdout.on, которая всегда асинхронна.Какой-нибудь пример кода, как мне этого добиться?
Я сделал более простой пример:
var colors = require( "colors" );
var readline = require( "readline" );
var child_pr = require( "child_process" );
var buffer = [];
var bufferReady = false;
const child = child_pr.spawn( 'dsmadmc', [ '-ID=support', '-PA=asdpoi123', '-comma', '-ALWAYSPrompt' ], { detached:true } );
child.stdout.on( "data", function( data ) {
var s = String( data );
buffer = buffer.concat( s.split( "\n" ) );
buffer.forEach( function( s ) { process.stdout.write( "STDOUT:" + s + "\n" ); } );
prompt();
} );
function exec( command ) {
switch ( command.toLowerCase() ) {
case 'select':
buffer = [];
child.stdin.write( "select node_name from nodes where node_name like '%'" + "\n" );
// I want to wait for the buffer ready here and print it
buffer.forEach( function( s ) { process.stdout.write( "SELECT:" + s + "\n" ); } );
prompt();
break;
case 'print':
buffer.forEach( function( s ) { process.stdout.write( "PRINT:" + s + "\n" ); } );
prompt()
break;
case 'exit':
case 'quit':
case 'q':
quit();
break;
default:
buffer.length = 0;
child.stdin.write( command + "\n" );
}
}
function prompt() {
var arrow = '> ',
length = arrow.length;
rl.setPrompt( arrow.bold.red, length );
rl.prompt();
}
var rl = readline.createInterface( {
input: process.stdin,
output: process.stdout,
} );
rl.on( 'line', function( cmd ) {
if ( cmd.match( /^\s*$/ ) ) {
prompt();
}
else {
exec( cmd.trim() );
}
} );
prompt();