HarmonyOS实战:一招办理等候多个并发结果

打印 上一主题 下一主题

主题 680|帖子 680|积分 2040

前言

     年前公司与华为签订了互助备忘录,加入了鸿蒙生态这个大家庭。。公司想赶着鸿蒙纯血系统上市之前,发布自己的鸿蒙软件。开辟鸿蒙NEXT版本软件就变成了今年的一个工作重心。
      本文主要讲授开辟过程中遇到的并发题目,官方API 11文档写的太简单了,根本没有办理方案,小编也是苦思冥想,绞尽脑汁才找到办理方案。需要开辟鸿蒙的小伙伴可以细致阅读,避免踩坑。
     题目

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

     扫除缓存代码如下:
                                   登录后复制                        
  1. import fs from '@ohos.file.fs'
  2.          
  3.     fs.access("文件路径").then((isHas:boolean) => {
  4.       if(isHas) { //判断文件是否存在
  5.         fs.rmdirSync("文件路径")//删除文件
  6.       
  7.       }
  8.     })
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
                       需要同时扫除这四个文件夹,然后再计算这四个文件夹的大小。由于fs.access 方法是耗时操作。所以只能在异步线程中实行。
     办理方案

     一般思绪

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

     注意是单次I/O使命,可题目是我们需要办理同时并发题目,一次拿到四次扫除缓存结果再去统计缓存大小。这个时间可能有的小伙伴就会说,那就先扫除第一个,等一个结果返回再扫除第二个,以此类推。也能办理题目。如下图所示:
                                   登录后复制                        
  1. fs.access("文件路径1").then((isHas:boolean) => {
  2.       if(isHas) { //判断文件是否存在
  3.         fs.rmdirSync("文件路径1")//删除文件
  4.                
  5.        fs.access("文件路径2").then((isHas:boolean) => {
  6.          if(isHas) { //判断文件是否存在
  7.            fs.rmdirSync("文件路径2")//删除文件
  8.              .....................
  9.         }
  10.     })
  11.       }
  12.     })
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
                       但是这样就会带来两个题目:多层嵌套与代码混乱。在Flutter中这个题目非常好办理。这里就不具体描述了。
     优雅方案

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

  • 先将文件扫除包装成一个异步使命。
                                   登录后复制                        
  1. asyncClear(dir: string): Promise<void> {
  2.     return new Promise((resolve, reject) => {
  3.       fs.access(dir).then((isHas: boolean) => {
  4.         if (isHas) {
  5.           fs.rmdir(dir)
  6.         }
  7.         resolve()
  8.       })
  9.     })
  10.   }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
                       

  • 将四个缓存文件夹对应的使命放在一个数组中。
                                   登录后复制                        
  1. let promises= [
  2.       this.asyncClear("文件夹1"),
  3.       this.asyncClear("文件夹2"),
  4.       this.asyncClear("文件夹3"),
  5.       this.asyncClear("文件夹4")
  6.     ]
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
                       

  • 将使命数组放进Promis.all中,等候四个使命实行竣事。
                                   登录后复制                        
  1. Promise.all(promises).then(() => {
  2.       // 结束回调
  3.     })
复制代码
      

  • 1.
  • 2.
  • 3.
                       

  • 在竣事回调中 再去调用计算缓存大小的方法。
                                   登录后复制                        
  1. storageStatistics.getCurrentBundleStats().then((bundleStats) => {
  2.         let cacheSizeNum = bundleStats.cacheSize
  3.         let unit = "KB"
  4.         if (cacheSizeNum > 1024) {
  5.           cacheSizeNum = Math.floor(cacheSizeNum) / 1024
  6.           unit = "KB"
  7.         }
  8.         if (cacheSizeNum > 1024) {
  9.           cacheSizeNum = Math.floor(cacheSizeNum) / 1024
  10.           unit = "MB"
  11.         }
  12.         if (cacheSizeNum > 1024) {
  13.           cacheSizeNum = Math.floor(cacheSizeNum) / 1024
  14.           unit = "GB"
  15.         }
  16.         if (cacheSizeNum > 1024) {
  17.           cacheSizeNum = Math.floor(cacheSizeNum) / 1024
  18.           unit = "TB"
  19.         }
  20.         let chacheSizeString = "" + Math.floor(cacheSizeNum) + unit
  21.       });
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
                       总结

     鸿蒙NEXT的API还不算完善,需要每个开辟者的加入,发现题目,提出题目,鸿蒙开辟人员才气更好的办理题目。如果您也是鸿蒙开辟者,有其他更好的办理方案,接待评论区交流 ,互相学习,互相成长!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦应逍遥

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表