У вас есть несколько проблем, большинство из которых связано с асинхронностью. Перед вашим редактированием я закрыл его вопросами канонической асинхронности, поскольку нет способа получить 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
.