异步编程在ArkTS中具体怎么实现?
大家好,我是 V 哥,很好奇,在ArkTS中实现异步编程是怎样的,今天的内容来聊聊这个问题,总结了一些学习笔记,分享给大家,在 ArkTS中实现异步编程主要可以通过以下几种方式:
1. 使用async
和await
关键字
async
函数是一种特殊的函数,它能以同步代码的方式编写异步代码。在async
函数内部,可以使用await
表达式来等待一个异步操作返回一个Promise对象。这种方式可以让异步代码的编写和阅读更接近同步代码的风格,提高代码的可读性和可维护性。
// 定义一个async函数
async function myAsyncFunction() {
// 使用await等待异步操作完成
const result = await someAsyncOperation();
console.log(result);
}
async函数和await关键字有什么区别?
async
和 await
是 JavaScript 中用于异步编程的两个关键字,它们共同工作以简化异步代码的编写和理解,但它们各自有不同的用途和含义:
async 关键字
async
是一个用于声明异步函数的关键字。- 任何使用
async
声明的函数都会自动返回一个Promise
对象。 - 如果函数正常执行结束,
Promise
将被解决(resolve)并返回函数的返回值。 - 如果函数中抛出错误,
Promise
将被拒绝(reject)。 async
函数内部可以包含一个或多个await
表达式。
await 关键字
await
是一个用于等待一个Promise
对象解决(resolve)的关键字。await
只能在async
函数内部使用。- 当执行到
await
表达式时,JavaScript 引擎会暂停该async
函数的执行,直到等待的Promise
被解决。 - 如果
Promise
被解决,await
表达式返回Promise
的值。 - 如果
Promise
被拒绝,await
表达式会抛出拒绝的原因,这可以通过try...catch
语句捕获。 await
后面通常跟的是一个异步操作,比如一个返回Promise
的函数调用。
它们的区别
async
是用来声明函数的,而await
是用来在函数内部等待异步操作的。async
本身不暂停代码执行,它只是让函数返回一个Promise
;而await
是用来暂停代码执行,直到Promise
被解决。async
可以不与await
一起使用,这时函数仍然返回一个Promise
,但不会暂停执行。await
必须用在async
函数内部,否则会抛出语法错误。
示例
// async 函数声明
async function fetchData() {
// 等待异步操作完成
const data = await fetchSomeData(); // 这里使用了 await
return data;
}
// 单独使用 async
async function justAsync() {
console.log('This is an async function, but without await.');
}
// 使用 await
async function useAwait() {
console.log('Before await.');
await justAsync(); // 等待 justAsync 完成
console.log('After await.');
}
所以啊, V哥提醒一下,async
和 await
是异步编程中两个互补的概念,async
用于声明异步函数,而 await
用于在异步函数内部等待异步操作的完成,初学者需要注意不要混淆了。
2. 使用Promise对象
上面我们已经提到Promise对象了,Promise是处理异步操作的对象,它提供了一个状态机制来管理异步操作的不同阶段,代表一个异步操作的最终完成(或失败)及其结果值,并提供了一些方法来注册回调函数以处理异步操作的成功或失败的结果。Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。
// 创建一个新的Promise
const myPromise = new Promise((resolve, reject) => {
// 异步操作
if (/* 异步操作成功 */) {
resolve("Success");
} else {
reject("Error");
}
});
// 使用then和catch处理Promise的结果
myPromise.then((value) => {
console.log(value); // "Success"
}).catch((error) => {
console.error(error); // "Error"
});
3. 异常处理
在异步函数中,如果出现错误,可以通过try...catch
语句来捕获异常。
async function myAsyncFunction() {
try {
const result = await someAsyncOperation();
console.log(result);
} catch (error) {
console.error(error);
}
}
4. 并发执行异步任务
可以使用Promise.all
来并发执行多个异步任务,并等待它们全部完成。
async function concurrentTasks() {
const [result1, result2] = await Promise.all([
asyncOperation1(),
asyncOperation2()
]);
console.log(result1, result2);
}
5. 使用Actor模型
ArkTS语言采用的Actor模型是一种并发编程模型,其中每个Actor都是一个独立的计算单元,拥有自己的状态和行为,并通过消息传递与其他Actor进行通信和协作。
1. Actor模型概述
在Actor模型中,每个Actor都可以接收异步消息,并根据消息内容和当前状态做出响应。Actor之间的消息传递是异步的,发送消息的Actor不需要等待接收消息的Actor的响应,从而实现并发执行。由于每个Actor都是独立的,它们之间不存在共享状态,因此不需要进行锁机制和同步操作,避免了一些常见的并发编程问题,如死锁和竞争条件。
2. 数据传输对象
ArkTS语言支持传输的数据对象可以分为四种:普通对象、可转移对象、可共享对象和Native绑定对象。普通对象的传输是通过结构化克隆算法进行序列化的,支持多种类型,包括基础类型、Date、String、RegExp、Array、Map、Set等。
3. 实现例子
以下是一个使用ArkTS的Actor模型实现的生产者消费者问题的示例:
生产者(Producer)和消费者(Consumer)的Actor模型实现:
import taskpool from '@ohos.taskpool';
// 跨线程并发任务
@Concurrent
async function produce(): Promise<number>{
// 添加生产相关逻辑
console.log("test producing...");
return Math.random();
}
class Consumer {
public consume(value: number) {
// 添加消费相关逻辑
console.log("test consuming value: " + value);
}
}
@Entry
@Component
struct Index {
@State message: string = 'Hello I am VG';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button() {
Text("start")
}.onClick(() => {
let produceTask: taskpool.Task = new taskpool.Task(produce);
let consumer: Consumer = new Consumer();
for (let index: number = 0; index < 10; index++) {
// 执行生产异步并发任务
taskpool.execute(produceTask).then((res: number) => {
consumer.consume(res);
}).catch((e: Error) => {
console.error(e.message);
})
}
})
.width('20%')
.height('20%')
}
.width('100%')
}
.height('100%')
}
}
在这个例子中,produce
函数是一个异步函数,模拟生产者的生产过程,并返回一个随机数作为产品。Consumer
类包含 consume
方法,用于消费产品。在UI界面上,当用户点击“start”按钮时,会启动10次生产任务,每次生产任务完成后,都会调用Consumer
的consume
方法来消费产品。
这个例子展示了如何在ArkTS中使用Actor模型来实现并发执行,其中生产者和消费者之间通过异步消息传递来通信,无需等待对方的响应,从而实现高效的并发处理。
最后
ArkTS提供了强大的异步编程能力,使得开发者可以有效地处理异步任务,提高程序的性能和响应能力。对于有 TypeScript 经验的兄弟是不是有种找到真爱的感觉呢。关注威哥爱编程,鸿蒙开天辟地,你我皆是同路人。
异步编程在ArkTS中具体怎么实现?的更多相关文章
- C#~异步编程在项目中的使用
一些闲话 对异步编程没有了解的同学可以看我的这篇文章<C#~异步编程>,今天主要说一下,在项目中怎么就用到了异步编程!在进行WEB开发时,异步这块我们用的并不多,但当你的项目做到一定规模时 ...
- .NET中的异步编程
开篇 异步编程是程序设计的重点也是难点,还记得在刚开始接触.net的时候,看的是一本c#的Winform实例教程,上面大部分都是教我们如何使用Winform的控件以及操作数据库的实例,那时候做的基本都 ...
- Netty 中的异步编程 Future 和 Promise
Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...
- 一文说通C#中的异步编程
天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章. 一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...
- C#~异步编程续~.net4.5主推的await&async应用
返回目录 之前写过两篇关于异步编程的文章,详细可以进入C#~异步编程和C#~异步编程在项目中的使用 .net的各个版本都有自己主推的技术,像.NET1.1中的委托,.NET2.0中的泛型,.NET3. ...
- 使用 Async 和 Await 的异步编程(C# 和 Visual Basic)[msdn.microsoft.com]
看到Microsoft官方一篇关于异步编程的文章,感觉挺好,不敢独享,分享给大家. 原文地址:https://msdn.microsoft.com/zh-cn/library/hh191443.asp ...
- C#:异步编程和线程的使用(.NET 4.5 )
摘自:http://www.codeproject.com/Articles/996857/Asynchronous-programming-and-Threading-in-Csharp-N(葡萄城 ...
- C#~异步编程续~.net4.5主推的await&async应用(转)
之前写过两篇关于异步编程的文章,详细可以进入C#~异步编程和C#~异步编程在项目中的使用 .net的各个版本都有自己主推的技术,像.NET1.1中的委托,.NET2.0中的泛型,.NET3.0中的Li ...
- 异步编程和线程的使用(.NET 4.5 )
C#:异步编程和线程的使用(.NET 4.5 ) 异步编程和线程处理是并发或并行编程非常重要的功能特征.为了实现异步编程,可使用线程也可以不用.将异步与线程同时讲,将有助于我们更好的理解它们的特征 ...
- 【C#复习总结】 Async 和 Await 的异步编程
谈到异步,必然要说下阻塞,在知乎上看到了网友举的例子非常省动,在这里我引用下. 怎样理解阻塞非阻塞与同步异步的区别? 老张爱喝茶,废话不说,煮开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响 ...
随机推荐
- Windows SSH 免密登陆远程计算机
上传公钥 如果远程计算机是类 Unix 系统,使用下面这条命令: Get-Content $Env:USERPROFILE\.ssh\id_rsa.pub | ssh USER@HOST " ...
- Redis实战11-实现优惠券秒杀下单
本篇,咱们来实现优惠券秒杀下单功能.通过本篇学习,我们将会有如下收获: 1:优惠券领券业务逻辑: 2:分析在高并发情况下,出现超卖问题产生的原因: 3:解决超卖问题两种方案:版本号法及CAS法 4:乐 ...
- 利用分布式锁在ASP.NET Core中实现防抖
前言 在 Web 应用开发过程中,防抖(Debounce) 是确保同一操作在短时间内不会被重复触发的一种有效手段.常见的场景包括防止用户在短时间内重复提交表单,或者避免多次点击按钮导致后台服务执行多次 ...
- Electron32-ViteOS桌面版os系统|vue3+electron+arco客户端OS管理模板
基于electron32+vue3 setup+pinia2桌面端os管理解决方案ElectronVue3OS. vue3-electron32-os全新原创Electron32+Vite5+Vue3 ...
- 【YashanDB数据库】数据库运行正常,日志出现大量错误metadata changed
问题现象 客户在麒麟kylin v10 sp1环境上部署YashanDB,运行正常, 但是在巡检中发现run.log中有大量错误日志文件metadata changed,需要排查原因 问题单:前置机大 ...
- .NET 9 中 LINQ 新增的功能
LINQ介绍 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称.数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持.此外,需要针对每种 ...
- CSS & JS Effect – Styling Select
参考 YouTube – Custom select menu - CSS only 原装 select 的缺点 这是一个原装 select design 它最大的问题是没有 spacing. bor ...
- Servlet——简介
Servlet 快速入门 1.创建web项目,导入Servlet依赖坐标 <dependencies> <dependency> <groupId>jav ...
- LeetCode 564. Find the Closest Palindrome (构造)
题意: 给一个数字n 求离n最近(且不等)的回文串 存在多个答案返回最小的 首先很容易想到 将数字分为两段,如 12345 -> 123/45,然后将后半段根据前面的进行镜像重置 123/45 ...
- MobileNet V2中InvertedResidual实现
1.为了方便理解其本身结构,找到源码理解一下. 2.论文地址:http://arxiv.org/pdf/1801.04381.pdf 3.V2相比较V1增加了倒残差结构和线性瓶颈层.整个结构按照维度来 ...