JavaScript在node.js / Node-RED中返回之前如何使节点等待?

经验丰富的程序员,没有经验的JavaScript程序员。

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

我正在使用console.info(标准输出)loggingsubprocess数据,所以我知道它正在适当的工作。 这是函数节点中的代码:

/* 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)放入该对象,但是在返回值之前,“return data_msg”总是执行。 我只想在返回这个节点之前等待我的外部进程返回数据。

谢谢您的帮助,

也许你正在寻找execSync ?

Node.js有asynchronous执行。 把一些东西放在函数中,并在callback中处理顺序执行或使用promise。 下面是我使用promise来确保scipt在其调用函数中使用stdout数据之前完成的。

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

 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; }); 

让我知道如果你有任何Q:D