В requestKeyCode()
вам нужно либо вернуть обещание, созданное в их, либо await
it. Как бы то ни было, ничего не было связано с обещанием, что функция asyn c возвращалась, поэтому она разрешится до того, как ваш sendTelegraphLoop()
будет фактически выполнен.
exports.requestKeyCode = async function() {
console.log('Entered requestDeviceInfo')
finalTelegram=newData.toString(16)+CHKS.toString(16);
this.ft=finalTelegram;
return sendTelegramLoop(this.ft, 0);
}
или с await
:
exports.requestKeyCode = async function() {
console.log('Entered requestDeviceInfo')
finalTelegram=newData.toString(16)+CHKS.toString(16);
this.ft=finalTelegram;
let keyCode = await sendTelegramLoop(this.ft, 0);
return keyCode;
}
Также нет причин использовать это:
.then(keyCode => {
return keyCode;
});
, поскольку он не делает ничего полезного. Это просто избыточный код. Обещание, которое вы уже разрешили на keyCode
, поэтому нет причин давать еще одно обещание с .then()
, которое также разрешается до keyCode
.
Тогда и sendTelegramLoop()
тоже проблемы. Вам необходимо убедиться, что обещание, возвращаемое вашей функцией async
, связано с асинхронными операциями внутри вашей функции. Этого не происходит в sendTelegramLoop()
.
Вот посмотрите на исправление sendTelegramLoop()
:
function delay(t) {
return new Promise(resolve => setTimeout(resolve, t));
}
global.comPost.writeP = util.Promisify(global.comPost.write);
async function sendTelegramLoop(telgeram, i ) {
try {
// is this delay a hack? Why is it here
await delay(50);
hasRead = false;
await global.comPort.writeP(telgeram, 'hex');
hasRead = await waitResponse();
if (!hasRead) {
return sendTelegramLoop(telegeram, i++);
} else {
console.log('enteredExitRoutine');
return hasRead;
}
} catch(err) {
console.log('Error on write: ', err.message)
throw err; // propagate error back to caller
}
}
Использование переменной с более высокой областью видимости, такой как hasRead
, то есть не объявлен локально. В любом случае, эта новая реализация фактически перехватывает все асинхронные операции в обещание, которое функция async
возвращает, и возвращает обещание, которое разрешается в значение hasRead
и работает рекурсивно.
Кроме того, в waitResponse
нет ничего асинхронного, поэтому это может быть обычная функция, а не функция async
.