HarmonyOS 鸿蒙Next 如何在for循环中调用await

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 如何在for循环中调用await

我现在需要再for循环中进行插入db的操作,db 会爆出 Inner error. Inner code is -19 的问题,code为14800000。  查询资料分析后觉得可能因为第一次插入没结束,就循环到下一次进行第二次插入。  所以如何能在for循环中等待async方法的结束,再进行下一次循环?

2 回复

可通过async/await语法实现

参考示例

async queryData(){

   {

     if (this.rdbStore == null) {

       console.error(Create Store1.db failed! store1 is null);

       return;

     }

   }

   try {

     let predicates: relationalStore.RdbPredicates = new relationalStore.RdbPredicates(“EMPLOYEE”);

     let resultSet = await this.rdbStore.query(predicates); // 查询所有数据

     console.info(Query data successfully! row count:${resultSet.rowCount});

     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”));

       console.info(id=${id}, name=${name}, age=${age}, salary=${salary});

       const tmp = new ItemBean(name, age.toString(), salary.toString());

       this.dbSet.push(tmp);

     }

     resultSet.close();

   } catch (err) {

     console.error(Query data failed! err code:${err.code}, err message:${err.message})

   }

 }

在HarmonyOS鸿蒙Next中,await 关键字通常用于异步函数调用,它会暂停当前执行流直到异步操作完成。在 for 循环中调用 await 需要特别注意,因为每次调用 await 都会使循环等待该异步操作完成,这可能导致性能问题,尤其是在处理大量数据时。

为了确保 for 循环能正确且高效地处理异步操作,你可以使用以下几种方法:

  1. 直接调用:如果异步操作之间没有依赖关系,直接在 for 循环中调用 await 是可行的,但需注意性能。

  2. 异步迭代:利用 for...of 循环和异步生成器(如果可用),可以更优雅地处理异步操作。

  3. Promise.all:如果所有异步操作可以并行执行,可以先将所有异步操作放入数组,然后使用 Promise.all 等待所有操作完成。

  4. forEach 与 async IIFE:使用立即执行异步函数表达式(IIFE)在 forEach 中包裹 await 调用,但这并不改变循环的同步性质,仅允许在每次迭代中执行异步操作。

示例代码(直接调用 await):

for (let i = 0; i < items.length; i++) {
    await asyncFunction(items[i]);
}

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部