HarmonyOS 鸿蒙Next中有关异步操作
HarmonyOS 鸿蒙Next中有关异步操作
getMyUserInfo() { DbUtil.getInstance().queryAllBean<MyUserInfo>(this.tb_setting_user, (data) => { return data }) 想封装一个方法, 返回关系型数据库查询返回的data数据, 请问怎么写代码? 上面的写法未考虑异步, 外部调用的时候返回的是undefined }
目前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中,异步操作主要通过TaskDispatcher和Promise机制来实现。TaskDispatcher用于任务的分发和执行,支持并行和串行任务调度。Promise则用于处理异步操作的返回结果,支持链式调用和错误处理。
TaskDispatcher提供了多种任务分发器,如GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher和SpecTaskDispatcher,分别用于全局任务、并行任务、串行任务和特定任务的分发。开发者可以通过TaskDispatcher提交任务,并指定任务的优先级和执行方式。
Promise是鸿蒙Next中处理异步操作的核心机制。开发者可以通过Promise对象来管理异步操作的状态和结果。Promise支持then、catch和finally方法,分别用于处理成功、失败和最终的操作。通过Promise,开发者可以避免回调地狱,简化异步代码的编写。
在鸿蒙Next中,异步操作的使用场景包括网络请求、文件读写、数据库操作等。开发者可以通过TaskDispatcher和Promise机制,高效地管理这些异步操作,确保应用的响应性和性能。
鸿蒙Next的异步操作机制与JavaScript中的Promise类似,但在底层实现上进行了优化,以适应鸿蒙系统的特性和需求。开发者可以利用这些机制,编写高效、可维护的异步代码。


