1

使用子进程,我执行 Python 脚本会执行一些吐回数据的操作。我使用 Node 承诺等到我得到 Python 数据。

我面临的问题是匿名函数有一个回调,回调接受两个参数,其中一个是 python 数据。下面的代码解释。我如何调用承诺,等到它解决然后调用回调。

节点承诺

var spawn = require("child_process").spawn;

function sensorData()
{
   return new Promise(function(resolve, reject)
   {
      var pythonProcess = spawn ("python",[pythonV1.py"]);
      pythonProcess.stdout.on("data", function(data)
      {
         resolve(data);
      });
   });

 }

匿名函数

...
onReadRequest : function(offest, callback)
{
   #============DOES NOT WORK=========================
   sensorData()
  .then(function(data) 
  {
     callback(this.RESULT_SUCCESS, data);
  })
  #===================================================

   #call promise, wait and then call callback passing the python data
   callback(this.RESULT_SUCCESS, new Buffer(#python data)
}
...

非常感谢

4

1 回答 1

0

除非您知道您的 pythonProcess 只会返回一行数据,否则在每个 stdout 数据调用上调用 resolve() 是不好的做法。在流程关闭之前收集数据并立即返回所有数据会更好。

我也不习惯处理缓冲区,所以我在这里将东西转换为字符串......

var spawn = require("child_process").spawn;

function sensorData()
{
   return new Promise(function(resolve, reject)
   {
      var output = '';
      var pythonProcess = spawn ("python",[pythonV1.py"]);
      pythonProcess.stdout.on("data", function(data)
      {
         output += data.toString();
      });

// Not sure if all of these are necessary
      pythonProcess.on('disconnect', function() 
      {
         resolve(output);
      });

      pythonProcess.on('close', function(code, signal)
      {
         resolve(output);
      });

      pythonProcess.on('exit', function(code, signal)
      {
         resolve(output);
      });
   });

 }


...
onReadRequest : function(offest, callback)
{
   #call promise, wait and then call callback passing the python data
   sensorData()
      .then(function(data) 
      {
         callback(this.RESULT_SUCCESS, data);
      })
      .catch(function(err) 
      {
         // Do something, presumably like:
         callback(this.RESULT_FAILURE, err);
      });
}
...
于 2018-03-02T02:22:46.570 回答