ts开发如何实现异步编程

ts开发如何实现异步编程

HarmonyOS
2024-05-26 17:49:35
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
lilyglp

介绍

js是单线程模型,执行引擎需要一件一件去处理任务,类似生活中的排队。但是队列中某个任务需要花费很多时间,就会导致后面的任务都将处于一种等待状态,甚至会出现页面假死现象,严重影响用户操作体验。

针对以上阻塞问题,我们可以使用异步编程来解决。

异步模式下,每个异步任务都有自己的一个或者多个回调函数,这样当前在执行的异步任务执行完后,不会马上执行事件队列中的下一项任务,而是执行它的回调函数。而下一项任务也不会等这个回调函数执行完,因为它不能确定当前的回调函数何时执行完毕,只要它被触发就会执行。

原理

主线程中的所有代码按照顺序依次执行,遇到同步便直接执行,遇到异步,先在Event Table中注册异步(这些操作无需花费多少时间),等异步操作的结果出来了,就把回调函数注册到事件队列。

js事件执行机制中有一个轮询的特点,即事件循环机制:主线程中的代码按照顺序依次,等到主线程空了,就把事件队列中要执行的回调函数放入主线程中,然后同步的执行。对于代码中的异步操作,先在Event Table中注册,等异步操作的结果出来了,就把回调函数注册到事件队列。

实现

例如:文件管理中的文件打开open接口都提供了3个形式,1个同步,2个异步,异步接口分别对应CallBack形式和Promis形式。

同步

openSync(path:string, flags?:number, mode?:number): number

以同步方法打开文件。

使用示例:

let fd = fileio.openSync(path, 0o102, 0o640);

说明:

接口调用后阻塞线程,直到文件描述符fd通过函数返回值获取,然后程序再向下执行。

异步回调CallBack

open(path: string, flags: number, mode: number, callback: AsyncCallback<number>): void

打开文件,使用callback异步回调。

使用示例:

fileio.open(path, 0o102, 0o640 ,function(err, fd) {   // do something });

说明:

函数第四个参数是一个function函数,function函数是一个异步任务,会加入到事件队列,文件描述符fd通过function的函数参数获取。

接口调用后不阻塞线程,程序可以继续向下执行,待主线程的任务执行完成,就开始执行异步任务。

异步期约Promise

open(path: string, flags?: number, mode?: number): Promise<number>

打开文件,使用Promise异步回调。

fileio.open(path, 0o102, 0o640) .then(function(fd){   console.info("open file succeed"); }) .catch(function(err){   console.info("open file failed with error:"+ err); });

说明:

与Callback一样是异步编程,但是文件描述符返回是通过promise的.then()函数返回,与Callback写法不一样。

接口调用后不阻塞线程,程序可以继续向下执行,待主线程的任务执行完成,就开始执行异步任务,接口执行成功则执行.then()函数,失败执行.catch()函数。

分享
微博
QQ
微信
回复
2024-05-27 22:37:15
相关问题
如何选择鸿蒙App开发编程语言
5830浏览 • 2回复 待解决
OpenHarmony idl如何实现异步回调?
3214浏览 • 1回复 待解决
api8如何实现异步线程跳转页面?
1169浏览 • 1回复 待解决
如何选择使用同步接口还是异步接口
612浏览 • 1回复 待解决
如何异步方法进行插桩/替换
274浏览 • 1回复 待解决
ts 声明式开发不能使用js的getApp()
3106浏览 • 1回复 待解决
编程烧录,需要什么软件?
2648浏览 • 1回复 待解决
有输入法编程接口吗?
3472浏览 • 1回复 待解决
Mac下有什么好的编程字体?
1103浏览 • 1回复 待解决
ArkTs中异步方法如何转变成同步方法
589浏览 • 0回复 待解决
js 怎么开启异步线程?
4736浏览 • 1回复 待解决
鸿蒙是否进行异步通信?
2592浏览 • 1回复 待解决
worker.ts如何获取context
677浏览 • 2回复 待解决