Я работаю с Web Bluetooth, который требует много асинхронных операций. Я реализовал сеттеры и геттеры для таких свойств, как имя устройства. Асинхронные сеттеры и геттеры по умолчанию не поддерживаются в 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>
Но следующее с установщиком приводит к справочной ошибке «Uncaught ReferenceError: Invalid left-hand side in присваивание» для установщика:
await device.connect();
await device.name = "newName";
await device.<some async BLE operation>
Если я удалю ключевое слово await
, ошибка будет исправлена, но сценарий завершится ошибкой, потому что он попытается выполнить две операции GATT одновременно, что не поддерживается.
Так что кажется, что я могу ждать только геттера, а не сеттера. Что-то не так с моей реализацией геттера, что вызывает это? Должен ли я вернуться к использованию такой функции, как device.nameSet()
, вместо сеттера при выполнении асинхронных операций?
Для справки, _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"));
}
}