0

我正在使用 Johnny-5、React 和 node.js 创建网站来控制我的 Arduino 板,但我一直在处理异步/等待功能。因此,用户将选择的端口(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()函数中获得适当的响应?

4

1 回答 1

4

我认为问题在于您正在监听事件,但这本身并不是 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);
于 2019-10-14T16:34:17.820 回答