我正在使用Johnny-five,React和node.js创建网站来控制我的Arduino板,但我卡在处理async/await功能上。因此,用户将所选端口(COM1(发送到服务器,然后服务器创建新的板实例
async function checkPortConnection(port) {
let board = new five.Board({port: port});
let success;
await board.on('error', () => {
success = false;
});
await board.on('ready', () => {
success = true;
});
return success;
}
我以为关键字 await 会停止函数执行并等待大约需要 7 秒的板响应,但是当我这样做时:
checkPortConnection(port).then((data)=>{
console.log(data);
});
我得到了"未定义",(因为我得到了success
哪个是未定义的? 之后,如果选择的端口正确,服务器将发送响应。 但我的问题是,如何从checkPortConnection()
函数中获得适当的响应?
我认为问题是你正在监听事件,但这本身并不是一个承诺。此外,如果是这样,并且您将使用await
您将永远无法访问注册ready
事件的代码。以下方法应解决此问题:
async function checkPortConnection(port) {
return new Promise((resolve, reject) => {
let board = new five.Board({port: port});
board.on('error', error => resolve( false ));
board.on('ready', event => resolve( true ));
});
}
就我个人而言,我也会执行以下操作,因为 Promise 将使用then
或稍后catch
,因此您可能希望完全忽略布尔位:
board.on('error', reject);
board.on('ready', resolve);