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

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 稍后将使用 thencatch,因此您可能希望完全忽略布尔位:

board.on('error', reject);
board.on('ready', resolve);