沧海一生笑
沧海一生笑
  • 发布:2021-11-12 13:34
  • 更新:2021-11-12 17:00
  • 阅读:455

蓝牙的函数都是异步模式的,如何设置为同步模式

分类:HTML5+

最近测试H5+的范例蓝牙程序
用手动 点 初始化蓝牙模块- 开始搜索蓝牙设备- 选择设备- 连接蓝牙设备- 获取服务- 获取特征码, 然后写入数据和读出数据,一切都是正常的, 实际运用中当然不能 这样写, 要写一个 一键连接蓝牙的程序, 悲催了, 这些调用类似于AJAX函数的异步模式, 即便像下面这样写, 哪个先执行完哪个后执行完都不一定的, 要正常调用成功一定要顺序执行。
openBluetooth();
sleep(500);
connectDevice();
sleep(500);
getServices();
sleep(500);
getCharacteristics();
H5的这些函数有没有类似AJAX的选项 async:false 的同步模式设置呢?
昨天我用安卓 在 调用里面 获取服务 成功后 嵌套调用 获取特征值,是成功的, 但是晚上手机自动升级到鸿蒙,却报错了
plus.bluetooth.getBLEDeviceServices({
deviceId: deviceId,
success: function(e){
var services = e.services;
outLine('获取服务成功! '+services.length);
if(services.length>0){
for(var i in services){
bss.push(services[i]);
outLine(JSON.stringify(services[i]));
}
if(bss.length>0){ // 默认选择最后一个服务
document.getElementById('service').value = serviceId = bss[bss.length-1].uuid;
bconnect=true;
getCharacteristics(); //这个是获取特征值函数,安卓可以这样用,鸿蒙不可以
}
}else{
outLine('获取服务列表为空?');
}
},
fail: function(e){
outLine('获取服务失败! '+JSON.stringify(e));
}
});

2021-11-12 13:34 负责人:无 分享
已邀请:
回梦無痕

回梦無痕 - 暂停服务

可以了解一下Promise

沧海一生笑

沧海一生笑 (作者)

我查了下,好像是自己建立一个promise 的回调函数是吧, 不过我不太懂,我用了一个奇葩的办法解决了
先执行 openBluetooth(); sleep(500); connectDevice(); 这两个连续运行不会报错,然后设置一个定时器, 设置一个执行步骤的变量runflag , 每执行完一步 runflag++,虽然解决了问题,不过这样写得不优雅, 有没有更好的解决办法?
self.setInterval("rungetServices()",3000);
}

function rungetServices(){
if (runflag==2) {
outLine('定时执行getServices');
getServices();
}
if (runflag==3) {
outLine('定时执行getCharacteristics');
getCharacteristics();
}
}

该问题目前已经被锁定, 无法添加新回复