簡體   English   中英

JavaScript中的異步設置器/獲取器

[英]Async setter / getter in JavaScript

我正在使用需要大量異步操作的Web藍牙。 我已經實現了屬性(例如設備名稱)的setter和getter。 異步getter和setter方法不被默認支持ES6,所以我用以下解決方法是建議在這里

get name() {
  return ( async () => {
    try {
      const data = await this._readData(this.nameCharacteristic);
      const decoder = new TextDecoder("utf-8");
      const name = decoder.decode(data);
      return name;
    } 
    catch (error) {
      return error;
    }
  })();
}

和:

set name(name) {
  return ( async (name) => {
    const byteArray = new Uint8Array(name.length);
    for (let i = 0; i < name.length; i += 1) {
      byteArray[i] = name.charCodeAt(i);
    }
    return await this._writeData(this.nameCharacteristic, byteArray);
  })(name);
}

我可以使用吸氣劑成功完成以下操作:

await device.connect();
await device.name;
await device.<some async BLE operation>

但是,以下帶有setter的操作會導致setter的參考錯誤“ Uncaught ReferenceError:分配中的無效左側”:

await device.connect();
await device.name = "newName";
await device.<some async BLE operation>

如果刪除await關鍵字,該錯誤已修復,但是腳本將失敗,因為它將同時嘗試兩次GATT操作,這是不支持的。

因此,看來我只能等待吸氣劑而不是塞特劑。 我對getter的實現是否有問題,導致這種情況? 進行異步操作時,我是否必須返回使用device.nameSet()類的函數而不是setter?

對於記錄, _writeData()_readData()如下所示:

async _writeData(characteristic, dataArray) {
  if (!this.bleIsBusy) {
    try {
      this.bleIsBusy = true;
      await characteristic.writeValue(dataArray);
      this.bleIsBusy = false;
    }
    catch (error) {
      return error;
    }
    return Promise.resolve();
  }
  else {
    return Promise.reject(new Error("GATT operation already pending"));
  }
}

async _readData(characteristic) {
  if (!this.bleIsBusy) {
    try {
      this.bleIsBusy = true;
      const dataArray = await characteristic.readValue();
      this.bleIsBusy = false;

      return dataArray;
    }
    catch (error) {
      return error;
    }
  }
  else {
    return Promise.reject(new Error("GATT operation already pending"));
  }
}

也許嘗試設置從返回的值,以await this._writeData(this.nameCharacteristic, byteArray); ...

set name(name) {
  return ( async (name) => {
    const byteArray = new Uint8Array(name.length);
    for (let i = 0; i < name.length; i += 1) {
      byteArray[i] = name.charCodeAt(i);
    }
    const result = await this._writeData(this.nameCharacteristic, byteArray);
    return result;
  })(name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM