如何等待函数执行并获得正确的承诺响应?



我正在使用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);

最新更新