距离这个帖子两年了,该问题依旧,我想到个不是很合适又无赖的办法,再写个超时的promise,跟发送数据的用Promise.race做竞争返回-1做为异常,如果出现-1就表示是超时了,还是走resolve。
// 发送数据通用方法
sendData(buffer) {
return new Promise(async (resolve, reject) => {
var promise = new Promise((succ, err) => {
uni.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
writeType: plus.os.name == 'iOS' ? 'write' : 'writeNoResponse',
success: () => {
console.log("发送数据成功");
succ();
},
fail: (err) => {
console.log("发送数据失败", err);
err(`发送数据失败: ${err.errMsg}`);
},
complete: function() {
console.log("123456");
}
});
});
if (plus.os.name == 'iOS') {
function timeout(ms) {
return new Promise((_, err) => {
setTimeout(() => {
err({
code: -1,
errMsg: '超时了'
})
}, ms);
});
}
Promise.race([promise, timeout(500)]).then(resolve).catch((ex) => {
console.log("ex=",ex);
if (ex.code == -1) {
resolve();
} else {
reject();
}
}).finally(() => {
console.log("完成了")
});
} else {
promise.then(resolve).catch(reject);
}
});
},
3 个回复
雪趣snow66 (作者)
Android write成功后有回调,ios没有。是uni.writeBLECharacteristicValue的回调没有不是notify
DCloud_iOS_WZT
https://uniapp.dcloud.net.cn/api/system/ble.html#writeblecharacteristicvalue 看下注意事项 是不是写入数据过长了
1***@qq.com
没用,标明的20字节,我才8字节。
2025-07-18 17:11
1***@qq.com
距离这个帖子两年了,该问题依旧,我想到个不是很合适又无赖的办法,再写个超时的promise,跟发送数据的用Promise.race做竞争返回-1做为异常,如果出现-1就表示是超时了,还是走resolve。
// 发送数据通用方法
sendData(buffer) {
1***@163.com
强啊
2025-07-19 10:46
1***@qq.com
回复 1***@163.com: 无奈之举啊,我们最好的办法是让硬件工程师把成功失败返回给我,哪一包成功哪一包失败状态都返回。没有硬件工程师只能这样做了。
2025-07-21 14:50