【问题标题】:Get Promise resolve from separate callback从单独的回调中获取 Promise 解决方案
【发布时间】:2021-10-21 00:54:36
【问题描述】:

我正在向蓝牙设备发送数据,响应由在连接过程中设置的侦听器处理:

device.connect().then(device => {
  device.registerResponseListener((data) => {
    // handle response
  }
}

我有一个向设备发送数据的单独函数:

const sendData = (device, data) => {
  device.write(data);
}

我的问题是,我如何 Promisify 这段代码?我希望能够做到

const sendData = (device, data) => {
  return new Promise((resolve, reject) => {
    device.write(data);
    // resolve...?
  });
}

但是如何将resolve 输入蓝牙响应侦听器?

【问题讨论】:

  • 你可以使用 async/await
  • 为什么需要promisify这个功能?你在解决什么问题?
  • registerResponseListener 有没有像unregisterResponseListener 这样的反义词?此 API 的任何文档?
  • 你需要a queue of resolve 函数
  • @VLAZ 因为我需要能够链接一系列请求。

标签: javascript promise


【解决方案1】:

我不知道您使用的是什么 API,但您可以尝试 BluetoothRemoteGATTCharacteristic API。它有 writeValueWithResponse 方法,返回 Promise。

https://developer.mozilla.org/en-US/docs/Web/API/BluetoothRemoteGATTCharacteristic

【讨论】:

  • 这个问题不是关于任何特定的 API,而是关于在一般情况下该做什么。
【解决方案2】:

如果我理解正确,那么你可以这样做

const sendData = async (device, data) => {
  const response = await device.write(data);
  await Promise.all(device.responseListeners.map(listener => listener(response)))
}

【讨论】:

    【解决方案3】:

    在这种情况下,最好的解决方案虽然仍然不理想,但将resolve 函数存储在更高范围的变量中:

    var sendDataResolve;
    
    device.connect().then(device => {
      device.registerResponseListener((data) => {
        sendDataResolve(data);
      }
    }
    
    const sendData = (device, data) => {
      return new Promise((resolve, reject) => {
        sendDataResolve = resolve;
        device.write(data);
      });
    }
    
    ...
    
    sendData(device, "data")
    .then(result => {
      console.log("Got result",result);
    });
    

    需要注意的是,不保证 Promise 解决方案与原始请求正确绑定。这一次只能处理一个请求。

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多