我是node.js中的newby,需要一点帮助才能通过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();