2017-05-19 2 views
0

ノードchild_processを使用して、システム内のプロセスを起動しています。私はdataの出力をdata,errorendexitイベントで発生したコールバックを使用してstdinstderrなどから制御できます。ノード内の子プロセスの発生時にエラーを実行して処理する方法

/** 
* Load model in memory 
*/ 
Executable.prototype.load = function() { 
    var self=this; 
    this.onExitCallback=null; 
    this.onDataCallback=null; 
    this.onErrorCallback=null; 
    return new Promise(function(resolve, reject) { 
     self.emitDeferred(EVENT_LOAD_START); 
     if(self.child) { 
      self.emitDeferred(EVENT_LOAD_DONE); 
      return resolve(true); 
     } 
     self.onErrorCallback = function(error) { 
      return reject(error); 
     } 
     var args =[ 
      '-input', 
      '-' 
     ]; 
     if(self._options.debug) console.log("load",args); 
     self.child=self.exec('runner', self._options.bin, args, self._options.child); 
     if(self._options.debug) self.child.stdout.pipe(process.stdout); 
     self.emitDeferred(EVENT_LOAD_DONE); 
     return resolve(true); 
    }); 
}//load 

と私はerrorコールバックのエラーを取得し、後者はで発射されるので、私は、resolveと呼ばれるrejectを持っています:

問題は、私はここのような実行可能ファイルをロードするときということですonErrorCallbackを維持しながら、resolveを避ける必要がある一方で、最初は、スポーンの直後に解雇されますが、onErrorCallbackです。

これは私のexecコードです:

/** 
    * Execute child process 
    */ 
    this.exec = function(name,command,params,options) { 
     var self=this; 
     var _options = { detached: false }; 
     for (var attrname in options) { _options[attrname] = options[attrname]; } 

     var created_time= (new Date()).toISOString(); 
     var task = require('child_process').spawn(command, params, _options); 
     task.stdout.on('data', function(_data) { 
      if(self.onDataCallback) self.onDataCallback.apply(self,[ new Buffer(_data,'utf-8').toString() ]); 
     }); 
     task.on('error', function(error) { 
      if(self._options.debug) console.error("exec:%s pid:%d error:\n",name,task.pid,error); 
      if(self.onErrorCallback) self.onErrorCallback.apply(self,[error]); 
     }); 
     task.on('uncaughtException', function (error) { 
      if(self._options.debug) console.error("exec:%s pid:%s uncaughtException:\n",name,task.pid,error); 
      if(self.onErrorCallback) self.onErrorCallback.apply(self,[error]); 
     }); 
     task.stdout.on('end', function(data) { 
      if(self._options.debug) console.log("exec:%s end.",name); 
     }); 
     task.stderr.on('data', function(data) { 
      //if(self._options.debug) console.log("exec:%s stderr:%s",name,data); 
      //if(!data) task.kill('SIGINT'); 
     }); 
     task.on('close', (code, signal) => { 
      if(self._options.debug) console.warn('task:%s pid:%s terminated due to receipt of signal:%s',name,task.pid,signal); 
     }); 
     task.on('exit', function(code) { 
      if(self._options.debug) console.log("exec:%s exit.",name); 
      if (code != null && code != 0) { 
       var error=new Error(); 
       error.description= command + ' ' + params.join(' '); 
       error.code=code; 
       if(self._options.debug) console.error("exec:%s pid:%d error:\n",name,task.pid,error); 
       task.kill('SIGINT'); 
       if(self.onExitCallback) self.onExitCallback.apply(self,[error]); 
      } else { 
       // at exit explicitly kill exited task 
       task.kill('SIGINT'); 
       if(self.onExitCallback) self.onExitCallback.apply(self); 
      } 
     }); 
     return task; 
    }//exec 

と実行中の子プロセスに生データを送信するためにsendコード:

/** 
    * Send data to child process 
    */ 
    this.send = function(data) { 
     this.child.stdin.setEncoding('utf-8'); 
     this.child.stdin.write(data + '\r\n'); 
    }//send 

だから、それだけで

myExecutable.load() 
.then(done => { 
    console.log("loaded %d", done); 
}) 
.catch(error => { 
    console.error("error",error); 
}); 
好きテストします

答えて

0

try{}catch(err){}のメカニズムを使用してonErrorCallbackをそのままの状態に保ちながら解決を回避するcatch内のonErrorCallbackによって起動されるコード。

+0

ありがとうございます、可能であれば、 'child_process'イベントに基づいて別のソリューションを使いたいと思います。 – loretoparisi

関連する問題