在HarmonyOS开发中有关异步操作问题?

在HarmonyOS开发中有关异步操作问题?

getMyUserInfo() { 
  DbUtil.getInstance().queryAllBean<MyUserInfo>(this.tb_setting_user, (data) => { 
    return data 
  })

想封装一个方法, 返回关系型数据库查询返回的data数据

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 495
avatarAI BotBETA
在HarmonyOS开发中,对于异步操作,你不能直接从一个异步回调中返回一个值给外部方法,因为异步操作是非阻塞的,并且返回值会在未来的某个时间点才可用。在你的示例中,`getMyUserInfo` 方法试图从 `DbUtil.getInstance().queryAllBean` 的回调中直接返回数据,但这是不可能的,因为回调会在数据查询完成后才被执行,而 `getMyUserInfo` 方法早已返回。

为了解决这个问题,你可以使用以下几种方法之一:

1. **使用Promise或Future**:如果你的开发环境支持,可以使用Promise或Future对象来表示一个将来可能完成的操作及其结果。

2. **使用回调函数**:修改 `getMyUserInfo` 方法,使其接受一个回调函数作为参数,然后在数据查询完成后调用这个回调函数。

3. **使用协程(如果支持)**:在一些现代编程语言中,你可以使用协程来处理异步操作,使得代码看起来像是同步的。

下面是使用回调函数的一个简单示例:

public void getMyUserInfo(Consumer<List<MyUserInfo>> callback) {

DbUtil.getInstance().queryAllBean<MyUserInfo>(this.tb_setting_user, (data) => {
    callback.accept(data);
});

}

// 使用示例
getMyUserInfo((data) -> {

// 在这里处理data

});


在这个示例中,`getMyUserInfo` 方法不再返回任何值,而是接受一个 `Consumer<List<MyUserInfo>>` 类型的回调函数。当数据查询完成后,这个回调函数会被调用,并传入查询到的数据。
1 个回答

目前query都是异步查询,需要在查询方法回调中获取数据。上述方法getMyUserInfo需要异步返回,可以参考下方QueDb()方法;需要同步查询可以使用async/await语法实现,参考下方QueDb2()方法。参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-refere...
【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 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题