Ionic蓝牙连接服务:如何等待函数执行完毕再返回结果?
解决Ionic蓝牙服务异步返回值问题
这个问题的核心是异步操作没有正确等待——你的bleConnexion函数虽然标记了async,但内部的ble.connect是基于Observable的异步操作,你没有等待它完成就直接返回了this.isConnected的初始值false。下面是具体的修改方案:
1. 修改蓝牙服务的bleConnexion函数
我们需要把Observable转换成Promise,并用Promise.race同时处理连接逻辑和超时逻辑,确保函数会等待操作完成后再返回结果:
public async bleConnexion(device): Promise<boolean> { this.loader = await this.loadCtrl.create({ message: "Connexion ..." }); await this.loader.present(); // 将ble.connect的Observable转换为Promise,处理连接成功/失败 const connectPromise = new Promise<boolean>((resolve) => { this.ble.connect(device.bleID).subscribe( (res) => { this.loader.dismiss(); this.isConnected = true; console.log(res); resolve(true); }, (error) => { this.loader.dismiss(); console.log(error); resolve(false); } ); }); // 处理15秒超时逻辑 const timeoutPromise = new Promise<boolean>(async (resolve) => { setTimeout(async () => { if (!this.isConnected) { await this.loader.dismiss(); this.displayError(); resolve(false); } }, 15000); }); // 等待连接或超时先完成的结果 const result = await Promise.race([connectPromise, timeoutPromise]); this.isConnected = result; return result; }
2. 修改组件中的调用方式
现在bleConnexion返回的是Promise<boolean>,所以你需要在async函数中用await来等待结果:
// 确保调用代码在async函数内部 async someComponentFunction() { const result = await this.myService.bleConnexion(myDevice); console.log("连接结果:", result); // 现在会正确返回true/false }
关键说明
Promise.race会监听两个Promise,哪个先完成就返回哪个的结果——如果15秒内连接成功,就返回true;如果超时还没连接,就触发错误提示并返回false。- 所有涉及UI的操作(比如
loader.dismiss())都加上了await,避免异步操作导致的UI状态不一致。 - 组件调用必须在async函数中,因为
await只能在async上下文里使用。
内容的提问来源于stack exchange,提问作者Yruama
相关产品推荐
相关产品推荐

