node.js порождает процесс backround и связывается с ним и позже использует его стандартный вывод в массиве - PullRequest
0 голосов
/ 14 декабря 2018

Я новичок в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...