node.js产生一个backround进程并与其进行通信,并稍后在数组中使用其stdout

时间:2018-12-14 08:42:32

标签: node.js async-await child-process spawn

我是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();

0 个答案:

没有答案