[英]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.