JavaScript: nodeJS: как получить данные из асинхронного метода внутри асинхронного метода внутри неасинхронного метода - PullRequest
0 голосов
/ 13 июня 2019

моя цель - получить результат от getGpsData () в result1 или было бы здорово, если бы я мог распечатать данные result1 в result2

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 Ответ

2 голосов
/ 13 июня 2019

У вас есть несколько проблем, большинство из которых связано с асинхронностью. Перед вашим редактированием я закрыл его вопросами канонической асинхронности, поскольку нет способа получить 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 создаст обещание, которое разрешится после 30 триггеров на port, а .then(result) в основном коде получит переданный аргумент. Как обсуждено в Как я могу вернуть ответ от асинхронного вызова? , это значение не может быть доступно в result2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...