gpt4 book ai didi

javascript - JavaScript 中的异步 setter/getter

转载 作者:行者123 更新时间:2023-12-04 17:55:13 27 4
gpt4 key购买 nike

我正在使用需要大量异步操作的网络蓝牙。我已经为设备名称等属性实现了 setter 和 getter。 ES6 默认不支持异步 setter 和 getter,因此我按照建议使用了以下解决方法 here :

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);
}

我可以使用 getter 成功地完成以下操作:

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

但是下面的 setter 会导致 setter 的引用错误“Uncaught ReferenceError: Invalid left-hand side in assignment”:

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

如果我删除 await 关键字,错误得到修复,但脚本将失败,因为它会同时尝试两个 GATT 操作,这是不支持的。

所以看来只能等待getter,不能等待setter。我执行的 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);
}

关于javascript - JavaScript 中的异步 setter/getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com