JavaScript:nodeJS:如何从非异步方法内部的异步方法中获取异步数据

时间:2019-06-13 04:09:00

标签: javascript node.js asynchronous

我的目标是从result1的getGpsData()获取结果 如果我可以在result2中打印result1数据,那就太好了

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

1 个答案:

答案 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上无法获得此值。