HarmonyOS 鸿蒙Next 异步获取到的数据怎么传出去?

HarmonyOS 鸿蒙Next 异步获取到的数据怎么传出去?

先上代码

Filepath:string = 'default'
init(){
var context = featureAbility.getContext()
context.getFilesDir((err,path)=>{
  if (err) {
    hilog.info(0x0000, 'dataBase', "init getFilesDir err:"+err);
    return
  }
  hilog.info(0x0000, 'dataBase', "init getFilesDir yes:"+path);
})
hilog.info(0x0000, 'dataBase', "init:"+this.Filepath);
}

在app.ets里面调用 init() 以及打印 Filepath的log日志

12-04 01:28:23.225 25127-25234/com.brejce.myapplication I 00000/dataBase: init:default
12-04 01:28:23.225 25127-25234/com.brejce.myapplication I 00000/dataBase: onCreate:default
12-04 01:28:23.237 25127-25234/com.brejce.myapplication I 00000/dataBase: onActive:default
12-04 01:28:23.365 25127-25234/com.brejce.myapplication I 00000/dataBase: onPageShow:default
12-04 01:28:23.382 25127-25234/com.brejce.myapplication I 00000/dataBase: init getFilesDir yes:/data/user/0/com.brejce.myapplication/files

我就想问问,手册里面写的是 AsyncCallback 为啥就传不出去,传不出去咋用,Promise??后面的每个用到这个path路径的时候都用Promise?页面上的数据也用Promise.then()???你总得让我把数据传出去啊,我之前不会typescript的,边看边写的,可是你个数据都传不出去咋搞啊?还没有sleep这种东西,自己实现也不算麻烦但是,你异步不可能就只能是默数个几秒,然后采取用path这种数据吧?万一几秒后还是没获取到数据,哪岂不是直接GG?

本来data_storage.getStorageSync这个都是同步方法了,结果文件路径获取不到,搞啥啊


# 指个明路吧

更多关于HarmonyOS 鸿蒙Next 异步获取到的数据怎么传出去?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

promise里传入函数的resolve参数,调用这个参数穿入的值就会出现在then里。然后我觉得你最好放完整代码,说test报错但是又没有test代码。还是去学习扎实一下语法知识吧,最近这几个问题都是语法不熟悉的问题,

更多关于HarmonyOS 鸿蒙Next 异步获取到的数据怎么传出去?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是的,这个ts我是边看arkui边学习的,test函数在截图右边下方,然后最近看了很多关于异步,async/await,Promise等等,我脑子里就一个问题,当我的第一个函数是异步函数时,那我后续需要依赖第一个函数的时候都会变成异步的,我根本跳不出去。

算求了,大哥我看了官方的首选项的例子,也是异步到黑,到页面都还是异步数据,我服了,这异步看来是没法变成同步的了,

很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。

也可以通过异步转同步,但是所有调用这个函数的都需要加asyncawait

我试着通过 async/await 设置睡眠,睡眠正常工作,在 app.ets 的 onCreate 运行 init() 也正常,但是在 index.ets 的 onPageShow 运行 test() 就会报错,内容是

Error message: Cannot read property putSync of undefined

Stacktrace:

SourceCode ( s.putSync\

虽然没提示在那个位置的那一行,但是根据 s.putSync 的 s 就确认是在 dataBase 的 37 行,那么问题来了,在 init() 方法后面 31 行之后的保存和获取是成功运行的,所以 this.storage 在 init() 内是被赋值成功了,但是 test() 报错,我看了哈报错的时间,是在睡眠期间报错的,也就是说在睡眠期间 this.storage 还没有被赋值,那么我现在就认为 init() 方法由于 aSync 变成了一个异步方法,虽然 dataBase 的第 24 行代码因为 睡眠 值是可以在第 31 行拿到,但是因为 init() 变成了一个异步,所以 test() 方法没有获取到 storage。虽然摆脱了一个异步问题,但是又出现了一个新的异步问题,这就是套娃啊,难搞。

async / await 是一种更好的写法,不行就用 then 也没问题。这个其实问题不大。为了方便的话你自己封装一个全局变量也是可以的。

用过了呀 then 是 Promise 的方法嘛,出不去啊,赋值给 .then 之外的变量根本没收到值,async 也用了,照别个写的,还是不行,要不兄弟空了,帮我敲个示例。

那我有时间试试吧。。。,

麻烦大佬了,我看了一些文章试着用了async,发现虽然摆脱了.then的异步问题,但是又产生了一个新的异步问题,吐了,真难用啊,这就是传说中的 异步地狱 ?

在HarmonyOS鸿蒙Next系统中,异步获取到的数据可以通过多种方式传出,具体取决于你的应用架构和需求。以下是一些常见的方法:

  1. 使用回调机制: 定义一个回调接口,在异步任务完成时调用该接口的方法,并将数据作为参数传递。这是处理异步数据传递的一种经典方式。

  2. 事件总线(Event Bus): 如果应用较大,可以使用事件总线模式。事件总线允许不同组件通过发布和订阅事件来通信,异步获取到的数据可以作为事件数据发布。

  3. LiveData或Observable对象: 在MVVM架构中,可以使用LiveData或类似的Observable对象来持有数据。当异步任务完成时,更新这些对象的状态,UI组件会自动观察到这些变化并更新。

  4. 全局状态管理: 对于全局状态,可以使用如全局变量、单例模式或依赖注入容器来存储和访问异步获取的数据。但请注意,全局状态管理可能导致代码难以维护,应谨慎使用。

  5. 通过Intent或Bundle传递: 如果是在组件间传递数据,可以使用Intent或Bundle将数据封装起来,然后在目标组件中解析。

这些方法各有优缺点,选择哪种方式取决于你的具体需求和应用的架构。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部