【问题标题】:JavaScript:nodeJS: how to get a data from an async method inside an async method inside non-async methodJavaScript:nodeJS:如何从非异步方法中的异步方法中的异步方法获取数据
【发布时间】:2019-06-13 15:07:40
【问题描述】:

我的目标是从 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;
            }
        });
    },
};

【问题讨论】:

  • @amadan,请帮我把它从重复中删除,因为我在这两个链接中看不到任何东西。事实上,甚至在我在这里发布这个问题之前,我就已经找到了这 2 个链接。我不是 javascript 专家。也许这就是为什么我不太了解提供的这两个链接中是否有答案的原因。但是据我所见。它完全不同。如果我在这里错了,请纠正我
  • 再看一遍,你是对的——异步问题只是你问题的一部分。如果您可以在 result1 中获取数据(但不是在 result2 中),这是一个单独的问题(但仍连接到我发布为重复的链接。)

标签: javascript node.js asynchronous


【解决方案1】:

这里有几个问题,其中大部分与异步有关。在您进行编辑之前,我用规范的异步问题关闭了它,因为无法在 result2 位置获得 result

您仍然有异步问题,只是在其他地方。您的 port.on(...) 回调正在返回您想要的值。这个值永远不会被使用。另一方面,异步函数getGpsData 没有任何自己的return,因此当它的promise 被解决时不会传递任何东西(即.then(result => ...) 不会收到任何东西。

最简单的方法是显式处理getGpsData 返回的promise。你有正确的想法是你想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 上可用。

【讨论】:

  • 非常感谢伙计,我还不精通承诺和解决问题。因此有很多失败的尝试。很高兴知道可以以这种方式使用 Promise。 Thjanks 很多
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多