0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS实战:一招解决等待多个并发结果

尤枫 来源:jf_54996641 作者:jf_54996641 2025-06-09 14:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

年前公司与华为签订了合作备忘录,加入了鸿蒙生态这个大家庭。。公司想赶着鸿蒙纯血系统上市之前,发布自己的鸿蒙软件。开发鸿蒙NEXT版本软件就变成了今年的一个工作重心。

** 本文主要讲解开发过程中遇到的并发问题,官方API 11文档写的太简单了,根本没有解决方案,小编也是苦思冥想,绞尽脑汁才找到解决方案。需要开发鸿蒙的小伙伴可以仔细阅读,避免踩坑。**

问题

在开发清除缓存的功能时,鸿蒙NEXT提供的文档中说明,应用缓存文件有四个,需要清除指定的四个缓存文件夹。如图所示:

清除缓存代码如下:

import fs from '@ohos.file.fs'
          
    fs.access("文件路径").then((isHas:boolean) = > {
      if(isHas) { //判断文件是否存在
        fs.rmdirSync("文件路径")//删除文件
       
      }
    })

需要同时清除这四个文件夹,然后再计算这四个文件夹的大小。由于fs.access 方法是耗时操作。所以只能在异步线程中执行。

解决方案

一般思路

鸿蒙官方文档API 11 提供了使用Promise和async/await处理异步并发问题。

注意是单次I/O任务,可问题是我们需要解决同时并发问题,一次拿到四次清除缓存结果再去统计缓存大小。这个时候可能有的小伙伴就会说,那就先清除第一个,等一个结果返回再清除第二个,以此类推。也能解决问题。如下图所示:

fs.access("文件路径1").then((isHas:boolean) = > {
      if(isHas) { //判断文件是否存在
        fs.rmdirSync("文件路径1")//删除文件
               
       fs.access("文件路径2").then((isHas:boolean) = > {
         if(isHas) { //判断文件是否存在
           fs.rmdirSync("文件路径2")//删除文件
             .....................
        }
    })
      }
    })

但是这样就会带来两个问题:多层嵌套与代码混乱。在Flutter中这个问题非常好解决。这里就不详细描述了。

优雅方案

使用Promise.all 解决。小编在官方文档中并没有找到Promise.all 相关说明,可能是鸿蒙还没注意到这种需求场景吧。直接上代码。

  1. 先将文件清除包装成一个异步任务。
asyncClear(dir: string): Promise< void > {
    return new Promise((resolve, reject) = > {
      fs.access(dir).then((isHas: boolean) = > {
        if (isHas) {
          fs.rmdir(dir)
        }
        resolve()
      })
    })
  }
  1. 将四个缓存文件夹对应的任务放在一个数组中。
let promises = [
      this.asyncClear("文件夹1"),
      this.asyncClear("文件夹2"),
      this.asyncClear("文件夹3"),
      this.asyncClear("文件夹4")
    ]
  1. 将任务数组放进Promis.all中,等待四个任务执行结束。
Promise.all(promises).then(() = > {
      // 结束回调
    })
  1. 在结束回调中 再去调用计算缓存大小的方法。
storageStatistics.getCurrentBundleStats().then((bundleStats) = > {
        let cacheSizeNum = bundleStats.cacheSize
        let unit = "KB"
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "KB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "MB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "GB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "TB"
        }
        let chacheSizeString = "" + Math.floor(cacheSizeNum) + unit
      });

总结

鸿蒙NEXT的API还不算完善,需要每个开发者的参与,发现问题,提出问题,鸿蒙开发人员才能更好的解决问题。如果您也是鸿蒙开发者,有其他更好的解决方案,欢迎评论区交流 ,互相学习,互相成长!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    60

    文章

    2856

    浏览量

    45340
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35539
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Swift 的并发系统并行运行多个任务

    ​​前言 Swift 内置并发系统的好处之是它可以更轻松地并行执行多个异步任务,这反过来又可以使我们显着加快可以分解为单独部分的操作。 在本文中,让我们看下几种不同的方法,以及这些
    的头像 发表于 11-11 11:33 251次阅读

    AppGallery Connect(HarmonyOS 5及以上) --公开测试创建并发布测试版本(三)

    。手机号码用于华为审核人员与您沟通审核问题,邮箱用于接收上架审核结果,应用整改或下架通知。 19.配置测试发布。 20.点击页面右上角“提交”,将测试版本提交审核。提交成功后,可在“版本列表”页面查看版本
    发表于 09-29 17:38

    AppGallery Connect(HarmonyOS 5及以上) --公开测试创建并发布测试版本(

    )的公开测试版本会自动下架。 发布测试版本 首先,您需创建并发布测试版本。最多支持1个公开测试版本在架, 1.登录AppGallery Connect,选择“APP” 2.在应用列表页
    发表于 09-26 17:24

    创建并发布测试版本(

    配置软件版本。 5.配置测试信息。 测试信息默认继承全网版本信息或最近个测试版本填写的信息。如需调整,请在当前测试版本提交前重新审视并修改,测试信息配置不影响全网版本的应用信息。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-16 15:21

    工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题

    ”。工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题。它从根源上保证了品质——原厂技术支持、稳定供货,不用担心中间环节出岔子,买得放心,用得也踏
    的头像 发表于 09-05 16:58 451次阅读
    工业电路总出问题?槟城BMG10D系列压敏复合器件:<b class='flag-5'>一招</b>解决过压难题

    HarmonyOS实战一招搞定保存图片到相册

    保存图片功能几乎是每个应用程序必备的功能之,当用户遇到喜欢的图片时可以保存到手机相册。那么在鸿蒙中保存图片是否也需要申请用户存储权限以及如何将图片保存到相册,本文将详细讲述怎么保存网络图片,指定布局生成图片保存至相册的功能实现。
    的头像 发表于 06-24 17:04 976次阅读

    鸿蒙5开发宝藏案例分享---应用并发设计

    ?** 鸿蒙并发编程实战指南:解锁ArkTS多线程黑科技** 嘿,开发者朋友们! 今天给大家扒扒鸿蒙官方文档里藏着的并发编程宝藏—— 100+实战
    发表于 06-12 16:19

    HarmonyOS实战:组件化项目搭建

    ?本文将详细讲解HarmonyOs组件化项目搭建的全过程,带领大家实现个组件化项目。 项目创建 首先创建个项目工程,点击开发工具DevEco-Stdio的****File 选项,选择 New 然后点击 Create Proj
    的头像 发表于 06-09 14:58 504次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:组件化项目搭建

    HarmonyOS NEXT 原生应用/元服务-ArkTS代码调试等待调试

    之前,将直处于等待状态。可通过进度条右侧的取消按钮进行取消。 拉起设备端应用,此时将会进入调试。 本文主要参考与引用自HarmonyOS官方文档。
    发表于 03-03 16:01

    一招治“浮”! 高精度3D线激光轮廓测量仪保障螺丝装配

    浮高产生的系列问题,都将对机器的安全运行埋下隐患。 各类因素产生的螺丝浮高 GL-8000系列 为您一招治“浮” 螺丝浮高检测案例 01 检测需求 1.次性扫描检测4个螺丝的高度差 2.精度要求0.03-0.05mm 3.速
    的头像 发表于 02-06 18:15 901次阅读
    <b class='flag-5'>一招</b>治“浮”! 高精度3D线激光轮廓测量仪保障螺丝装配

    名单公布!【书籍评测活动NO.56】极速探索HarmonyOS NEXT:纯血鸿蒙应用开发实践

    HarmonyOS NEXT的开发框架体系,帮助读者快速建立起整体认知。书中包含了大量实战案例,涵盖界面构建、网络交互、多设备适配和协同开发等多个场景。另外,书中还详细讲解了HarmonyOS
    发表于 01-20 16:53

    文详解CMP并发多协议

    随着无线通信的不断发展,对可同时支持多个协议的设备的需求显著增加。此功能称为并发多协议(Concurrent Multiprotocol, CMP),允许设备同时在不同无线标准下运行,从而提高设备的多功能性和适应性。
    的头像 发表于 01-03 10:12 1654次阅读
    <b class='flag-5'>一</b>文详解CMP<b class='flag-5'>并发</b>多协议

    HarmonyOS课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

    HarmonyOS课》焕新升级,赋能开发者快速掌握鸿蒙应用开发 随着HarmonyOS NEXT发布,鸿蒙生态日益壮大,广大开发者对于系统化学习平台和课程的需求愈发强烈。近日,华为精心打造
    发表于 01-02 14:24

    教你三异地访问NAS

    NAS作为家庭或企业存储数据的神器,能够让我们随时随地访问存储在其中的文件。但当我们身处异地时,如何高效、安全地访问NAS却成了个难题。别担心,节点小宝来帮你! 第一招:利用内网穿透功能 首先,在
    的头像 发表于 01-02 11:26 1822次阅读
    教你三<b class='flag-5'>招</b>异地访问NAS

    存储空间告急?NAS扩容一招搞定,轻松无忧!

    和vlog …… 这些点点滴滴 都是我们共同走过2024年的珍贵凭证 当硬盘的进度条渐渐变红 仿佛在向我们展示这年来满满的收获 但存储空间紧急告急怎么办? NAS扩容一招搞定 、阵列扩容 在不改变阵列模式,保证数据不被删除的
    的头像 发表于 12-24 16:35 1148次阅读
    存储空间告急?NAS扩容<b class='flag-5'>一招</b>搞定,轻松无忧!