var serialport = require('serialport');
var gps = require('./GPS_SerialPort.js');
processGpsData();
function processGpsData() {
gps.getGpsData().then(result => {
console.log("result1: "+result); // need result here
});
console.log("result2: "+result); // need result here
}
文件2。
var serialport = require('serialport');
module.exports = {
getGpsData:async () =>{
var port = new serialport("/dev/ttyACM0",{baudRate: 9600});
port.on('open', function () {
process.stdin.resume();
process.stdin.setEncoding('utf8');
});
port.on('error', function (err) {
console.error(err);
process.exit(1);
});
var test="";
var counter=0;
port.on("data",function(data){
counter++;
test +=data;
if(counter>30){
console.log("test1: "+test);
// return test; //need return this, but not working
port.close();
// resolve(test);
return test;
}
});
},
};
答案 0 :(得分:2)
您这里有几个问题,其中大多数与异步性有关。在您进行编辑之前,由于无法将result
放在result2
位置,因此我以规范的异步性问题将其关闭。
在其他地方,您仍然存在异步性问题。您的port.on(...)
回调函数返回所需的值。该值永远不会被使用。另一方面,异步函数getGpsData
本身没有任何return
,因此在其承诺得到解决时将不传递任何内容(即.then(result => ...)
将不接收任何内容。
最简单的方法是显式处理getGpsData
返回的诺言。您有一个正确的想法,就是您想要resolve(test)
而不是return test
,但是resolve
未定义,因为您没有相关的承诺。
这是您需要做的:
return new Promise(resolve => {
port.on("data",function(data){
counter++;
test +=data;
if(counter>30){
console.log("test1: "+test);
port.close();
resolve(test);
}
});
});
由于您的getGpsData
不包含await
,并且正在手动处理其承诺,因此您不需要async
关键字。调用getGpsData
时将构造一个promise,它将在port
上触发30次后解决,并且主代码中的.then(result)
将接收传递的参数。如How do I return the response from an asynchronous call?中所述,在result2
上无法获得此值。