【问题标题】:JavaScript How to make a node wait before returning in node.js/Node-RED?JavaScript 如何让节点在返回 node.js/Node-RED 之前等待?
【发布时间】:2016-02-24 20:16:14
【问题描述】:

有经验的程序员,没有经验的 javascript 程序员。

我正在使用 Node-RED,并且在我的一个节点中,我正在使用“child_process”调用一个外部程序,该程序通过标准输出将数据发送回我的节点。

我正在使用 console.info(stdout) 来记录子进程数据,所以我知道它工作正常。这是函数节点内的代码:

/* required modules */
var cp = context.global.child_process;

/* variables */
var packet = {};
var cmd = '~/packet/packet.py ';

/* construct the packet object */
packet.networkTime = (msg.payload[3] << 24) + (msg.payload[2] << 16) + (msg.payload[1] << 8) + msg.payload[0];
packet.sampleCount = msg.payload[4];
packet.uncompressedWidth = msg.payload[5];
packet.compressedWidth = msg.payload[6];

packet.sample0 = (msg.payload[8] << 8) + msg.payload[7];

var compressedData = msg.payload.slice(9);

/* change buffer type to array */
packet.compressedData = [];
compressedData.forEach(
    function(element){
        packet.compressedData.push(element);
    }    
);

/* stringify the object */
var packet_str = "'" + JSON.stringify(packet) + "'";

/* this section will execute the command */
cp.exec(
    cmd + packet_str,
    function(error, stdout, stderr){
        console.info(stdout);
        return JSON.parse(stdout);
    }
);

//return data_msg;

我尝试将 data_msg 设置为 {} 并使用 JSON.parse(stdout) 放入该对象,但“返回 data_msg”总是在返回值之前执行。我只是想在返回这个节点之前等待我的外部进程返回数据。

感谢您的帮助,

【问题讨论】:

    标签: javascript node.js node-red


    【解决方案1】:

    Node.js 具有异步执行功能。将一些东西放在函数中,并在回调中处理顺序执行或使用 Promise。下面是我对 Promise 的使用,用于确保 scipt 在调用函数中使用它的标准输出数据之前完成执行。

    在 stderr 上,promise 被拒绝并传播错误消息。在标准输出数据存储在结果中。当进程完成时,数据会在 promise 被解决时返回。

    var spawn = require('child_process').spawn;
    
    anExecutable = function(cmd, packet_str){
      return new Promise(function(resolve, reject){
    
        var aProcess = spawn(cmd, packet_str);
    
        aProcess.stdout.on('data', (data) =>{
          var result = JSON.parse(data);
        });
        aProcess.on('error', (error) => {
          reject(error);
        });
        aProcess.on('exit', (code) => {
          resolve(result);
        });
      });
    }
    

    这样调用:

    anExecutable(cmd, packet_str).then(function(data_msg){
      return data_msg;
    }).catch(function(error){
      return error;
    });
    

    如果你有任何问题,请告诉我:D

    【讨论】:

      【解决方案2】:

      也许您正在寻找execSync

      【讨论】:

      • 我没有忽视你,我只是被另一个问题分心了。谢谢你的参考,我试试看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多