如何等待函数执行并获得适当的承诺响应?
How to wait for function to execute and get proper promise response?
我正在使用 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);
});
我得到 'undefined',(因为我得到 success
未定义?)
如果选择的端口正确与否,服务器将发送响应。
但我的问题是,如何从 checkPortConnection()
函数获得正确的响应?
我认为问题在于您正在监听事件,但这本身并不是一个 Promise。此外,如果它们是并且您将使用 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);
我正在使用 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);
});
我得到 'undefined',(因为我得到 success
未定义?)
如果选择的端口正确与否,服务器将发送响应。
但我的问题是,如何从 checkPortConnection()
函数获得正确的响应?
我认为问题在于您正在监听事件,但这本身并不是一个 Promise。此外,如果它们是并且您将使用 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);