空安全-模块-并发
空安全-模块-并发
默认情况下,ArkTS中的所有类型都是不可为空的,因此类型的值不能为空。这类似于TypeScript的严格空值检查模式(strictNullChecks),但规则更严格。
非空断言运算符后缀运算符!可用于断言其操作数为非空。应用于可空类型的值时,它的编译时类型变为非空类型。例如,类型将从T | null更改为T:
空值合并运算符空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined。如果是,则表达式的结果为右侧表达式;否则,结果为左侧表达式。
空安全
export class A{
a:number=0
}
export function fc(aa:A|null){
//console.log(`${aa!.a}`)
console.log(`${aa!.a}`)//可选链
}
export function hb(str:string|null){
// return (str!=null && str!=undefined)?str:'ads'
return str ?? 'ads'
}
模块
程序可划分为多组编译单元或模块。每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。导出可以使用关键字export导出顶层的声明。未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。注意:通过export方式导出,在导入时要加{}。
如果在异步函数中,可以使用let module = await
let p1=new Promise((resolve,reject)=>{
//生成随机数,小于0.5失败,大于0.5成功
let num=Math.random()
if(num<0.5){
reject('小于0.5')
}else{
resolve('成功'+num)
}
})
p1
.then(data=>{
console.log(data);
})
.catch(err=>{
console.log(err);
})
.finally(()=>{
console.log('最终执行');
})
并发
异步并发 (Promise和async/await)Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。无需另外启动线程执行。异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作。
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);
})
async/awaitasync/await是一种用于处理异步操作的Promise语法糖,使得编写异步代码变得更加简单和易读。通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。async函数是一个返回Promise对象的函数,用于表示一个异步操作。在async函数内部,可以使用await关键字等待一个Promise对象的解析,并返回其解析值。如果一个async函数抛出异常,那么该函数返回的Promise对象将被拒绝,并且异常信息会被传递给Promise对象的onRejected()方法
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)
}
}
console.log('主线任务开始');
asy()
console.log('主线任务开始1');
console.log('主线任务开始2');
console.log('主线任务开始3');
console.log('主线任务开始4');
console.log('主线任务开始5');
console.log('主线任务开始6');