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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文分享了在开发鸿蒙NEXT版本软件时遇到的并发问题及解决方案。公司为赶在鸿蒙纯血系统上市前发布相关软件,将开发重点放在清除缓存功能上。针对需同时清除四个缓存文件夹的需求,文章分析了官方API 11文档中提供的异步处理方法(如Promise和async/await)的不足,并提出使用Promise.all实现优雅解决方案,避免多层嵌套与代码混乱。通过封装异步任务、构建任务数组及统一处理结果,最终实现高效清除缓存并统计大小的功能。文末呼吁开发者共同参与优化鸿蒙生态。

前言

年前公司与华为签订了合作备忘录,加入了鸿蒙生态这个大家庭。。公司想赶着鸿蒙纯血系统上市之前,发布自己的鸿蒙软件。开发鸿蒙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还不算完善,需要每个开发者的参与,发现问题,提出问题,鸿蒙开发人员才能更好的解决问题。如果您也是鸿蒙开发者,有其他更好的解决方案,欢迎评论区交流 ,互相学习,互相成长!

目录
相关文章
|
1月前
|
前端开发 UED 容器
11.HarmonyOS Next响应式导航栏实战:主轴方向与间距控制完全指南
响应式导航栏是现代应用UI设计中的重要组成部分,能够根据设备尺寸或用户偏好自动调整布局,提供更好的用户体验。在HarmonyOS Next中,我们可以利用强大的Flex布局和状态管理机制轻松实现这一功能。 本教程将详细讲解如何使用HarmonyOS Next的ArkUI框架实现一个能够在移动端和桌面端之间切换的响应式导航栏,重点关注Flex布局的主轴方向控制和间距设置。
53 0
|
2月前
|
开发工具 开发者
HarmonyOS实战:腾讯IM之聊天详情页面搭建(二)
本文讲解了在鸿蒙系统中实现腾讯IM聊天功能的完整流程,涵盖对话列表展示、历史消息获取、实时消息更新及文本消息发送等核心功能。通过实际代码示例,详细说明了如何利用IM SDK实现聊天业务逻辑。适合开发者逐步学习并实践,建议点赞收藏以便参考。
118 9
HarmonyOS实战:腾讯IM之聊天详情页面搭建(二)
|
1月前
HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
本文详细介绍了鸿蒙 IM 聊天中实现消息撤回、删除和重发功能的方法。消息撤回支持在 120 秒内召回自己发送的消息,通过 `revokeMessage` 方法实现;消息删除使用 `deleteMessage` 方法清除本地与云端记录;消息重发则先删除失败消息再重新发送,并处理用户被拉黑的异常情况。结合状态管理,可轻松实现类似微信的功能,建议点赞收藏并动手实践!
99 3
HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
|
1月前
|
定位技术 UED
70. [HarmonyOS NEXT 实战案例九] 旅游景点网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的旅游景点网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的旅游景点应用。
60 1
|
1月前
|
容器
69.[HarmonyOS NEXT 实战案例九] 旅游景点网格布局(上)
本教程将详细讲解如何使用HarmonyOS NEXT中的GridRow和GridCol组件实现旅游景点网格布局。通过网格布局,我们可以以美观、规整的方式展示各种旅游景点信息,为用户提供良好的浏览体验。
55 1
|
1月前
|
UED
68.[HarmonyOS NEXT 实战案例八] 电影票务网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的电影票务网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的电影票务应用。
55 1
|
1月前
|
开发者 容器
67.[HarmonyOS NEXT 实战案例八] 电影票务网格布局(上)
在移动应用开发中,电影票务应用是一个常见的场景,用户可以通过应用查看正在热映的电影信息,并进行选座购票等操作。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现电影票务应用中的电影列表网格布局,帮助开发者掌握网格布局的基本用法和实现技巧。
54 1
|
1月前
|
UED
66.[HarmonyOS NEXT 实战案例七] 健身课程网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的健身课程网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的健身课程应用。
55 1
|
1月前
|
设计模式 UED
65. [HarmonyOS NEXT 实战案例七] 健身课程网格布局(上)
本教程将介绍如何使用HarmonyOS NEXT的GridRow和GridCol组件实现健身课程的网格布局展示。健身课程网格布局是一种常见的UI设计模式,适用于展示各种健身课程信息,包括课程名称、教练信息、课程时长、难度级别等。通过网格布局,用户可以快速浏览多个课程,并根据自己的需求选择合适的课程。
58 1
|
1月前
|
设计模式 容器
61.[HarmonyOS NEXT 实战案例五] 社交应用照片墙网格布局(上)
社交应用中的照片墙是一种常见的UI设计模式,它以网格形式展示用户的照片集合,让用户可以浏览、分享和互动。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现一个美观、灵活的社交应用照片墙网格布局。 在本教程中,我们将学习如何设计照片墙的数据结构、如何使用GridRow和GridCol组件创建网格布局、如何实现照片卡片,以及如何处理不同尺寸的照片。通过本教程,你将掌握使用GridRow和GridCol组件实现复杂网格布局的技巧。
53 1