Arkts 空安全,模块,并发
使用catch方法注册一个回调函数,用于处理“失败”的结果,即捕获Promise的状态改变为rejected状态或操作失败抛出的异常。通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。Promise提
Arkts 空安全,模块,并发
空安全
非空断言符
- 后缀运算符!可用于断言其操作数为非空。
- 应用于可空类型的值时,它的编译时类型变为非空类型。例如,类型将从T | null更改为T:
空值合并运算符
- 空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined。如果是,则表达式的结果为右侧表达式;否则,结果为左侧表达式。
- 换句话说,a ?? b等价于三元运算符(a != null && a != undefined) ? a : b。
- 在以下示例中,getNick方法如果设置了昵称,则返回昵称;否则,返回空字符串
//空值合并运算符
export function nb(str: string | null) {
// return (str!=null && str!=undefined)?str:'asd'
return str ?? 'asa'
}
可选链
- 在访问对象属性时,如果该属性是undefined或者null,可选链运算符会返回undefined
- 说明:getSpouseNick的返回类型必须为string | null | undefined,因为该方法可能返回null或者undefined。
- 可选链可以任意长,可以包含任意数量的?.运算符。
- 在以下示例中,如果一个Person的实例有不为空的spouse属性,且spouse有不为空的nick属性,则输出spouse.nick。否则,输出undefined
//非空断言
export class A {
a: number = 0
}
export function fc(aa: A | null) {
// aa?.a=9
// console.log(`${aa!.a}`)
console.log(`${aa?.a}`)//可选链
}
模块
1.从HarmonyOS NEXT Developer Preview 1版本开始引入Kit概念。SDK对同一个Kit下的接口模块进行了封装,开发者在示例代码中可通过导入Kit的方式来使用Kit所包含的接口能力。其中,Kit封装的接口模块可查看SDK目录下Kit子目录中各Kit的定义。
2.通过导入Kit方式使用开放能力有三种方式:
-
方式一:导入Kit下单个模块的接口能力
-
方式二:导入Kit下多个模块的接口能力。
-
方式三:导入Kit包含的所有模块的接口能力。
其中,“module”为别名,可自定义,然后通过该名称调用模块的接口。
方式三可能会导入过多无需使用的模块,导致编译后的HAP包太大,占用过多资源,请谨慎使用。
程序可划分为多组编译单元或模块。
每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。
与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。
导出
可以使用关键字export导出顶层的声明。
未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。注意:通过export方式导出,在导入时要加{}。
并发
- 并发是指在同一时间内,存在多个任务同时执行的情况。对于多核设备,这些任务可能同时在不同CPU上并行执行。对于单核设备,多个并发任务不会在同一时刻并行执行,但是CPU会在某个任务休眠或进行I/O操作等状态下切换任务,调度执行其他任务,提升CPU的资源利用率。
- 为了提升应用的响应速度与帧率,避免耗时任务对主线程的影响,ArkTS提供了异步并发和多线程并发两种处理策略。
- 异步并发是指异步代码在执行到一定程度后会被暂停,以便在未来某个时间点继续执行,这种情况下,同一时间只有一段代码在执行。ArkTS通过Promise和async/await提供异步并发能力,适用于单次I/O任务的开发场景。
- 多线程并发允许在同一时间段内同时执行多段代码。在主线程继续响应用户操作和更新UI的同时,后台线程也能执行耗时操作,从而避免应用出现卡顿。ArkTS通过TaskPool和Worker提供多线程并发能力,适用于耗时任务等并发场景。
- 并发多线程场景下,不同并发线程间需要进行数据通信,不同类别对象的传输方式存在差异,包括拷贝或内存共享等。
异步并发
1.Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。无需另外启动线程执行。
2.异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作。
promise
Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。Promise提供了一个状态机制来管理异步操作的不同阶段,并提供了一些方法来注册回调函数以处理异步操作的成功或失败的结果。
Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。Promise对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected状态。
最基本的用法是通过构造函数实例化一个Promise对象,同时传入一个带有两个参数的函数,通常称为executor函数。executor函数接收两个参数:resolve和reject,分别表示异步操作成功和失败时的回调函数。
// resolve成功 reject失败
let p1=new Promise((resolve,reject)=>{
// 生成随机数,小于0.5失败 大于0.5成功
let num=Math.random()
if (num<0.5) {
reject('小于0.5')
}else{
resolve('成功:'+num)
}
})
Promise对象创建后,**可以使用then方法和catch方法指定fulfilled状态和rejected状态的回调函数。**then方法可接受两个参数,一个处理fulfilled状态的函数,另一个处理rejected状态的函数。只传一个参数则表示当Promise对象状态变为fulfilled时,then方法会自动调用这个回调函数,并将Promise对象的结果作为参数传递给它。使用catch方法注册一个回调函数,用于处理“失败”的结果,即捕获Promise的状态改变为rejected状态或操作失败抛出的异常。
let p1=new Promise((resolve,reject)=>{
// 生成随机数,小于0.5失败 大于0.5成功
let num=Math.random()
if (num<0.5) {
reject('小于0.5')
}else{
resolve('成功:'+num)
}
})
// then用来处理resolve的数据 data成功后返回的数据
p1
.then(data=>{
console.log(data);
})
.catch(err=>{ //err错误
console.log(err);
})
.finally(()=>{//最终处理
console.log('最终执行');
})
//生成10个随机数,每隔一秒生成一个
let p2 = new Promise((r, j) => {
setTimeout(() => {
r(Math.random())
}, 1000);
})
p2.then(data => {
console.log(data);
// 下一个要执行的异步操作
return new Promise((r, j) => {
setTimeout(() => {
r(Math.random())
}, 1000);
})
}, err => {
//处理失败
console.log(err);
}
)
.then(data => {//接受的是上一个then的return的异步操作的结果
console.log(data);
})
.catch(err => {
console.log(err);
})
export function p() :Promise<number>{
return new Promise((r, j) => {
setTimeout(() => {
let num = Math.random()
if (num > 0.5) {
r(num)
} else {
j('拒绝:你是一个好人')
}
}, 1000);
})
}
async/await
async/await是一种用于处理异步操作的Promise语法糖,使得编写异步代码变得更加简单和易读。通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。
async函数是一个返回Promise对象的函数,用于表示一个异步操作。在async函数内部,可以使用await关键字等待一个Promise对象的解析,并返回其解析值。如果一个async函数抛出异常,那么该函数返回的Promise对象将被拒绝,并且异常信息会被传递给Promise对象的onRejected()方法
async函数 达到的效果是同步代码的效果
// f()
// 1.生成promise
function p() {
return new Promise((r, j) => {
setTimeout(() => {
let num = Math.random()
if (num > 0.5) {
r(num)
} else {
j(-1)
}
}, 1000);
})
}
// 使用异步函数
async function asy() {
console.log('开始执行异步操作');
try {
let num1 = await p()
console.log(num1);
let num2 = await p()
console.log(num2);
} catch (error){
console.log(error);
}
}
asy()
export async function asy() {
console.log('开始执行异步操作');
try {
let num1 = await p()
console.log(`${num1}`);
let num2 = await p()
console.log(`${num2}`);
} catch (error){
console.log(error);
}
}
更多推荐

所有评论(0)