You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:57:32