WebBluetoothAPIでAsync/Awaitが利用可能に



WebBluetoothでは基本的にはPromiseを利用する必要がありますが、Async/Awaitが利用できるようになりました。
これにより可読性の高いコードが書けるようになります。

例えば、バッテリー残量を参照するコードで比較してみます。

Promise ver.

function onButtonClick() {
  log('Requesting Bluetooth Device...');
  navigator.bluetooth.requestDevice(
    {filters: [{services: ['battery_service']}]})
  .then(device => {
    log('Connecting to GATT Server...');
    return device.gatt.connect();
  })
  .then(server => {
    log('Getting Battery Service...');
    return server.getPrimaryService('battery_service');
  })
  .then(service => {
    log('Getting Battery Level Characteristic...');
    return service.getCharacteristic('battery_level');
  })
  .then(characteristic => {
    log('Reading Battery Level...');
    return characteristic.readValue();
  })
  .then(value => {
    let batteryLevel = value.getUint8(0);
    log('> Battery Level is ' + batteryLevel + '%');
  })
  .catch(error => {
    log('Argh! ' + error);
  });
}

こちらは Async/Await ver.

async function onButtonClick() {
  try {
    log('Requesting Bluetooth Device...');
    const device = await navigator.bluetooth.requestDevice({
        filters: [{services: ['battery_service']}]});

    log('Connecting to GATT Server...');
    const server = await device.gatt.connect();

    log('Getting Battery Service...');
    const service = await server.getPrimaryService('battery_service');

    log('Getting Battery Level Characteristic...');
    const characteristic = await service.getCharacteristic('battery_level');

    log('Reading Battery Level...');
    const value = await characteristic.readValue();

    log('> Battery Level is ' + value.getUint8(0) + '%');
  } catch(error) {
    log('Argh! ' + error);
  }
}

then()を都度都度で書かなくて済むのでスッキリしますね。

Bluetooth Low Energy: The Developer's Handbook

Bluetooth Low Energy: The Developer's Handbook

iOS×BLE Core Bluetoothプログラミング

iOS×BLE Core Bluetoothプログラミング

Bluetooth Low Energyをはじめよう (Make:PROJECTS)

Bluetooth Low Energyをはじめよう (Make:PROJECTS)