HarmonyOS鸿蒙Next中异步数据库操作与等待机制

HarmonyOS鸿蒙Next中异步数据库操作与等待机制 在应用启动时,数据库初始化是异步的,但其他服务可能在数据库初始化完成前就尝试访问数据库。如何设计一个可靠的等待机制,确保所有数据库操作都在初始化完成后执行?如何处理等待超时的情况?(问题来源项目案例整理:https://github.com/heqiyuan35-creator/HydroQuiz.git

3 回复

设计一个基于 Promise 的等待机制:

class DatabaseService {
  private isInitialized: boolean = false;
  private initResolvers: Array<() => void> = [];
  async waitForReady(timeoutMs: number = 10000): Promise<boolean> {
    if (this.isReady()) {
      return true;
    }
    return new Promise<boolean>((resolve) => {
      const timeout = setTimeout(() => {
        // 超时处理
        const index = this.initResolvers.indexOf(resolveFunc);
        if (index > -1) {
          this.initResolvers.splice(index, 1);
        }
        Logger.warn('[DatabaseService] Wait for ready timeout');
        resolve(false);
      }, timeoutMs);
      const resolveFunc = () => {
        clearTimeout(timeout);
        resolve(true);
      };
      this.initResolvers.push(resolveFunc);
    });
  }
  private notifyReady(): void {
    for (const resolver of this.initResolvers) {
      resolver();
    }
    this.initResolvers = [];
  }
  async initialize(context: Context): Promise<void> {
    // ... 初始化逻辑
    this.isInitialized = true;
    this.notifyReady();  // 通知所有等待者
  }
}

使用方式

private async loadStatistics(): Promise<void> {
  const isReady = await databaseService.waitForReady(10000);
  if (!isReady) {
    Logger.warn('Database not ready, using default values');
    return;
  }
  // 执行数据库操作
}

更多关于HarmonyOS鸿蒙Next中异步数据库操作与等待机制的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,异步数据库操作通过Promise或async/await机制实现非阻塞数据访问。开发者使用RDB或对象关系映射(ORM)接口执行查询、插入等操作时,系统会返回Promise对象,允许后续代码继续执行。通过await关键字可暂停当前异步函数,直到数据库操作完成并返回结果,从而避免回调地狱,简化异步流程处理。

在HarmonyOS Next中,处理异步数据库初始化与依赖服务的同步问题,核心在于建立一个状态管理和等待机制。以下是几种推荐方案:

1. 使用Promise/Async Await进行同步等待

在应用入口或数据库管理类中,将初始化封装为异步函数,并使用全局状态标志。

// DatabaseManager.js
let dbInitialized = false;
let initPromise = null;

async function initializeDatabase() {
  if (initPromise) return initPromise;
  initPromise = new Promise(async (resolve, reject) => {
    try {
      // 执行实际初始化操作
      await db.init(...);
      dbInitialized = true;
      resolve();
    } catch (error) {
      reject(error);
    }
  });
  return initPromise;
}

// 其他服务调用
async function someServiceOperation() {
  if (!dbInitialized) {
    await initializeDatabase();
  }
  // 安全执行数据库操作
  await db.query(...);
}

2. 事件通知机制

通过HarmonyOS的EventHub或自定义事件,在初始化完成后广播通知。

// 初始化完成后
eventHub.emit('database_ready');

// 依赖服务订阅
eventHub.on('database_ready', () => {
  // 执行数据库操作
});

3. 超时处理与容错

为等待机制增加超时控制,避免无限阻塞。

async function waitForDatabase(timeout = 5000) {
  const startTime = Date.now();
  while (!dbInitialized) {
    if (Date.now() - startTime > timeout) {
      throw new Error('Database initialization timeout');
    }
    await new Promise(resolve => setTimeout(resolve, 100));
  }
}

// 使用示例
try {
  await waitForDatabase();
} catch (error) {
  // 降级处理或错误上报
  console.error(error);
}

4. 依赖注入模式

在应用启动阶段完成初始化,并通过依赖注入将已初始化的数据库实例传递给服务模块。

关键建议

  • 在应用启动生命周期(如onCreate)尽早开始初始化
  • 对于非关键路径,可考虑懒加载+缓存策略
  • 记录初始化状态日志,便于排查问题
  • 超时时间根据实际设备性能调整

这些方案能有效确保数据库操作在初始化完成后执行,同时通过超时机制保障系统可用性。具体选择可根据应用架构复杂度决定,简单场景推荐方案1,复杂模块化应用可考虑方案2或4。

回到顶部