HarmonyOS 鸿蒙Next中有关异步操作

HarmonyOS 鸿蒙Next中有关异步操作

getMyUserInfo() { DbUtil.getInstance().queryAllBean<MyUserInfo>(this.tb_setting_user, (data) => { return data }) 想封装一个方法, 返回关系型数据库查询返回的data数据, 请问怎么写代码? 上面的写法未考虑异步, 外部调用的时候返回的是undefined }

4 回复

目前query都是异步查询,需要在查询方法回调中获取数据。 上述方法getMyUserInfo需要异步返回,可以参考下方QueDb()方法;需要同步查询可以使用async/await语法实现,参考下方QueDb2()方法。

后续API 12新增了同步查询接口,就可以直接获取返回数据了。参考文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-relationalstore-V5#ZH-CN_TOPIC_0000001930676225__querysync12

【QueDb()方法】

async QueDb(predicates: relationalStore.RdbPredicates):Promise<string> {
  let rdata:string='';
  // 刷新
  if (this.rdbStore != undefined) {
  let db=this.rdbStore.query(predicates, ['ID', 'NAME', 'AGE', 'SALARY']);
  return db.then((resultSet) => {
  console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);
// resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
this.dbSet = [];

while (resultSet.goToNextRow()) {
  const id = resultSet.getLong(resultSet.getColumnIndex("ID"));
  const name = resultSet.getString(resultSet.getColumnIndex("NAME"));
  const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));
  const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));
  rdata=name;
  console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);
}
console.log("查询到的数据数量为:"+resultSet.rowCount);
// 释放数据集的内存
resultSet.close();
return rdata;
})
} else {
  return rdata
}
}

QData()
{
  let predicates = new relationalStore.RdbPredicates('EMPLOYEE');
  let data:string;
  this.QueDb(predicates).then((s:string)=>{
    //异步方法在在回调中获取数据
    console.info('获取到的数据:'+s);
    data=s
  })
  //后续操作
}

【QueDb2()方法】

async QueDb2(predicates: relationalStore.RdbPredicates) {
  let rdata:string='';
  // 刷新
  if (this.rdbStore != undefined) {
    let resultSet=await this.rdbStore.query(predicates, ['ID', 'NAME', 'AGE', 'SALARY']);
    console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);
    while (resultSet.goToNextRow()) {
      const id = resultSet.getLong(resultSet.getColumnIndex("ID"));
      const name = resultSet.getString(resultSet.getColumnIndex("NAME"));
      const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));
      const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));
      rdata=name;
      console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);
    }
    console.log("查询到的数据数量为:"+resultSet.rowCount);
    // 释放数据集的内存
    resultSet.close();
    return rdata;
  } else {
    return rdata
  }
}

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


class UserInfo {
}

async function getMyUserInfo(): Promise<UserInfo> {
  let info: UserInfo = await new DB().query()
  return info
}

async function getMyUserInfo2(): Promise<UserInfo> {
  let p = new DB().query()
  return await p
}

class DB {
  async query(): Promise<UserInfo> {
    return new UserInfo()
  }
}

在HarmonyOS鸿蒙Next中,异步操作主要通过TaskDispatcherPromise机制来实现。TaskDispatcher用于任务的分发和执行,支持并行和串行任务调度。Promise则用于处理异步操作的返回结果,支持链式调用和错误处理。

TaskDispatcher提供了多种任务分发器,如GlobalTaskDispatcherParallelTaskDispatcherSerialTaskDispatcherSpecTaskDispatcher,分别用于全局任务、并行任务、串行任务和特定任务的分发。开发者可以通过TaskDispatcher提交任务,并指定任务的优先级和执行方式。

Promise是鸿蒙Next中处理异步操作的核心机制。开发者可以通过Promise对象来管理异步操作的状态和结果。Promise支持thencatchfinally方法,分别用于处理成功、失败和最终的操作。通过Promise,开发者可以避免回调地狱,简化异步代码的编写。

在鸿蒙Next中,异步操作的使用场景包括网络请求、文件读写、数据库操作等。开发者可以通过TaskDispatcherPromise机制,高效地管理这些异步操作,确保应用的响应性和性能。

鸿蒙Next的异步操作机制与JavaScript中的Promise类似,但在底层实现上进行了优化,以适应鸿蒙系统的特性和需求。开发者可以利用这些机制,编写高效、可维护的异步代码。

在HarmonyOS鸿蒙Next中,异步操作主要通过TaskDispatcherPromise机制来实现。TaskDispatcher用于管理和调度任务,支持异步任务的执行和线程切换。Promise则用于处理异步操作的结果,通过thencatch方法分别处理成功和失败的回调。开发者可以使用asyncawait关键字简化异步代码的编写,使代码更具可读性。同时,鸿蒙Next还提供了EventBus等机制,支持跨线程的事件通信,进一步提升异步编程的灵活性。

回到顶部