【问题标题】:How to wait for function to execute and get proper promise response?如何等待函数执行并获得正确的承诺响应?
【发布时间】:2019-10-14 16:17:37
【问题描述】:

我正在使用 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() 函数中得到正确的响应?

【问题讨论】:

  • 我不知道你正在使用的五个库,但是由于on 函数有一个回调,它可能不会返回一个承诺......你需要包装你的整个返回值在一个承诺中,然后 resolvereject 取决于哪个事件被触发。否则它只会注册事件处理程序并返回值。

标签: javascript async-await es6-promise johnny-five


【解决方案1】:

我认为问题在于您正在监听事件,但这本身并不是 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);

【讨论】:

  • reject 只能使用 Error 调用,因此对第二个选项 +1。如果您希望此 Promise 解析为 truefalse,则 errorready 处理程序都应改为调用 resolve
  • @jacob 这确实是真的,很好的收获(编辑后的帖子)。我也更喜欢第二种解决方案,因为有关事件或错误的任何信息都可以很好地传递并且可以正确处理。那里没有信息丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2020-10-17
  • 2018-02-03
相关资源
最近更新 更多