【发布时间】:2020-07-15 08:40:02
【问题描述】:
我在这部分开发一个 Angular/Node 应用程序,我触发一个外部设备来读取 NFC 卡并将此信息发送到 Angular。但节点在我获得 NFC 信息之前返回 HTTP 响应。
编辑以澄清更多观点
key.controller.js 这是我在用户点击某个按钮请求 NFC 阅读器读取某张卡后进入 node.js 的位置
exports.requestKeyCode = async (req, res) => {
console.log('KeyController');
keyHelper.requestKeyCode().then( data =>{
console.log('Did I wait?')
res.send(data);
}).catch(err => {
res.status(500).send({
message:
err.message || "Some error occurred while retrieving Role."
});
});
}
keyYHelper在这个帮助程序中,有一些额外的代码构造了发送到 NFC 阅读器以读取 NFC 卡的电报
exports.requestKeyCode = async function() {
console.log('Entered requestDeviceInfo')
finalTelegram=newData.toString(16)+CHKS.toString(16);
this.ft=finalTelegram;
sendTelegramLoop(this.ft, 0).then( keyCode => {
return keyCode ;
})
}
这里期望继续将电报发送到 NFC 阅读器,直到读取到有效的内容
async function sendTelegramLoop(telgeram, i ) {
setTimeout(() => {
hasRead = false;
global.comPort.write(telgeram, 'hex' ,function(err) {
hasRead = waitResponse().then(hasRead => {
if (err) {
return console.log('Error on write: ', err.message)
}
if (!hasRead){
sendTelegramLoop(telgeram, i++);
} else {
console.log('enteredExitRoutine');
return hasRead;
}
} );
})
}, 50)
}
在这里我将 comPort 设置为读取模式并开始监听 NFC 阅读器发送的电报,并过滤有效的响应电报。
async function waitResponse() {
console.log("waiting keyInfo");
rcvTelegram = global.comPort.read().toString('hex');
if (rcvTelegram.startsWith('a40101001c0a000') && rcvTelegram.length===56){
console.log("breaking telegram")
keyInfo = telegramHelper.breakTelegram(rcvTelegram) ;
console.log('Key Read='+ keyInfo);
return keyInfo;
}
}
基本上发生的情况是,在我将命令发送到我的设备以读取卡后,nodeJS 正在返回 HTTP 请求。
如何强制它等待。
【问题讨论】:
-
尝试使用
Promise.all()
标签: node.js promise async-await