HarmonyOS 异步接口是否会启动一个子线程来执行其中的逻辑?
HarmonyOS 异步接口是否会启动一个子线程来执行其中的逻辑?
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
销毁一个子窗口的方法
410浏览 • 1回复 待解决
HarmonyOS Row容器里两个子控件,怎么让一个子控件居左,另一个子控件居中
70浏览 • 1回复 待解决
HarmonyOS 如何封装一个异步线程TaskPool任务为一个promise
34浏览 • 1回复 待解决
如何指定多个异步任务在同一个辅助线程内执行
854浏览 • 0回复 待解决
HarmonyOS 如何在class中启动一个线程
30浏览 • 1回复 待解决
由UIAbility创建的一个子窗口,能配置为可拖动吗
1681浏览 • 1回复 待解决
UIAbility在onBackground执行耗时操作时是否会影响另外一个UIAbility的onForeground
2011浏览 • 1回复 待解决
Ability在onBackground执行耗时操作时是否会影响另外一个Ability的onForeground
1780浏览 • 1回复 待解决
关于鸿蒙napi的异步机制的疑问,执行逻辑是跑在js线程上吗?
8032浏览 • 1回复 待解决
HarmonyOS 同一个父组件中的其中一个grid拖拽其中item 怎么避免影响其他的grid?
310浏览 • 1回复 待解决
#鸿蒙学习大百科#如何通过WindowStage创建一个子窗口?
337浏览 • 1回复 待解决
HarmonyOS 在native侧开发,c++多线程开发中,子线程中如何丢一个任务到主线程中执行
82浏览 • 1回复 待解决
HarmonyOS multinavigation库适配平行视界时是否有统一拦截第一个子页面继续出栈的行为
364浏览 • 1回复 待解决
主线程怎么才能判断子线程是否已经执行结束了
6830浏览 • 1回复 待解决
Native子线程切回主线程传递的env是否会变化
1723浏览 • 1回复 待解决
HarmonyOS 一个Row组件包含N+1个子组件,前N个组件尺寸不固定,最后一个组件要求填满Row组件剩下的空间
320浏览 • 1回复 待解决
启动一个已启动的Ability,什么情况下才会执行onNewWant()回调
2161浏览 • 1回复 待解决
启动一个已启动的UIAbility,什么情况下才会执行onNewWant()回调
2094浏览 • 1回复 待解决
HarmonyOS 想在app启动的时候在某几个page里面执行一个方法
130浏览 • 1回复 待解决
HarmonyOS 怎么判断一个视图是否在执行动画
28浏览 • 1回复 待解决
ArkTS线程模型中是否是每个线程跑一个runtime实例
1931浏览 • 1回复 待解决
异步机制ArkTS仅在单线程(主线程)上执行任务,其异步机制与JavaScript一致,都是通过宿主环境提供的线程实现(napi,其接口与nodejs一致),即通过EventLoop实现。
EventLoopEventLoop负责循环监视调用堆栈和回调队列,如果调用堆栈为空,它将从回调队列中获取第一个事件,并将其推送到调用堆栈。
以setTimeout为例:
console.log(‘Hi’);setTimeout(function cb1() {console.log(‘cb1’);}, 5000);console.log(‘Bye’);执行顺序:
console.log(‘Hi’); 该语句被添加到调用堆栈中,随着执行完,被移除调用堆栈;
setTimeout(function cb1() { … });该语句首先被添加到调用堆栈,被执行时,宿主环境创建了一个计时器,为代码计时。当该语句被执行完,会被移除调用堆栈。
等待至少5000ms,定时器执行完,把cb1回调函数添加到回调队列里面,EventLoop把cb1从回调队列中取出,添加到调用堆栈中。
注意,setTimeout中设置的时间,是计时器过期时将回调放入回调队列的时间,而不是回调函数被执行的时间(只有调用栈是空的,EventLoop才会从调用栈中取)
执行顺序与JavaScript一样,AkrTs也存在宏任务(Macrotask)队列和 微任务(Microtask)队列。宏任务例如setTimeout、setInterval,微任务例如普通回调函数,Promise相关函数等。
其执行顺序为:从 宏任务 队列中出队并执行最早的任务(只执行一个);执行所有微任务当微任务队列非空时:出队(dequeue)并执行最早的微任务;继续检查微任务队列空不空(即执行完所有的微任务,新创建的微任务会立即进入微任务队列排队执行,不需要等待下一次轮回);如果有变更,则将变更渲染出来;如果宏任务队列为空,则休眠直到出现宏任务;转到步骤 1。举例
setTimeout(() => hilog.debug(0, TAG, “timeout”));new Promise<void>((resolve, reject) => {hilog.debug(0, TAG, “resolve”);resolve();}).then(() => hilog.debug(0, TAG, “promise”));hilog.debug(0, TAG, “code”);执行顺序:
resolve最先显示,因为Promise内的代码也是同步执行;
code 接着显示,因为它是常规的同步调用;
promise 第二个出现,因为 then 会通过微任务队列,并在当前代码之后执行;
timeout 最后显示,因为它是一个宏任务。