1、async和await
定义:async/await是一种用于处理异步操作的Promise语法糖,通过使用async
关键字声明一个函数为异步函数,并使用await
关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。
使用:
async
:修饰函数,使其返回一个 Promise 对象。若函数内返回非 Promise 值,会自动包装为Promise.resolve(值)
。await
:只能在async
函数内使用,会暂停代码执行,等待右侧的 Promise 完成(fulfilled
或rejected
)。- 错误处理:用
try/catch
捕获异常。
2、Promise 及其状态
定义:Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,并提供了一些方法来注册回调函数以处理异步操作的成功(resolve
)或失败(reject
)的结果。
三种状态:
- Pending(进行中):初始状态,未完成。
- Fulfilled(已成功):操作成功完成,通过
resolve(value)
触发。 - Rejected(已失败):操作失败,通过
reject(error)
触发。
状态特性:
- 状态一旦改变(从
Pending
到Fulfilled
或Rejected
),不可逆,且仅能从Pending→Fulfilled/Rejected。 - 通过
.then()
处理成功结果,.catch()
处理错误,.finally()
执行最终逻辑。
3、回调地狱及其解决方案
定义:多层嵌套的回调函数导致的代码难以阅读和维护的情况。
多层嵌套:
getData(function(result1) {
processData(result1, function(result2) {
saveData(result2, function(result3) {
console.log('All done:', result3);
});
});
});
解决方案:
-
Promise 链式调用:用
.then()
扁平化代码。//根据得到的结果调用不同函数 getData() .then(result1 => processData(result1)) .then(result2 => saveData(result2)) .then(result3 => { console.log('All done:', result3); }) .catch(error => { console.error('Error:', error); });
-
async/await:用同步写法处理异步。
//result*保存异步返回的结果,失败/成功
async function main() {
try {
const result1 = await getData();
const result2 = await processData(result1);
const result3 = await saveData(result2);
console.log('All done:', result3);
} catch (error) {
console.error('Error:', error);
}
}
main();
4、同步代码和异步代码的区别
同步代码:代码自上往下执行,每一步必须等上一步完成,会阻塞后面的代码执行。
异步代码:异步代码不会阻塞程序执行,它允许程序在等待某些操作(如I/O、网络请求等)完成的同时继续执行其他任务。
区别:
特性 | 同步(Synchronous) | 异步(Asynchronous) |
---|---|---|
执行顺序 | 顺序执行,逐行等待完成 | 跳过耗时操作,先执行后面的代码 |
是否阻塞线程 | 是,当前线程会被挂起 | 否,会继续执行后面的代码,不会卡住程序 |
使用场景 | 简单计算逻辑 | 网络请求、读取文件、定时器、数据库操作等 |
代码写法 | 简洁但不适合慢操作 | 可通过回调、Promise、async/await 实现 |
优点 | 简单直观,易于理解 | 更高性能,用户界面不卡顿 |
缺点 | 慢操作会卡死程序 | 控制流程更复杂(但可以用 async/await 优化) |
5、静态类型和动态类型有什么区别
静态类型:变量的类型在编译阶段就确定了,不能改成其他类型。
动态类型:变量的类型在运行时才确定,类型可以改变。
区别:
对比点 | 静态类型(Static Typing) | 动态类型(Dynamic Typing) |
---|---|---|
定义方式 | 指定变量类型,不能更改 | 使用 any ,类型随时可以变 |
🧠 类型检查 | 编译阶段报错 | 运行时才可能出错 |
🧪 示例 | let age: number = 18; age = 'hello'; // 报错 |
let age: any = 18; age = 'hello'; // OK |
用于什么场景 | 常用于 ArkUI 组件、接口返回值、模型定义等 | 快速原型、处理未知数据、灵活数据结构等 |
安全性 | 高,能预防大多数类型错误 | 低,灵活但容易写错不报错 |
🧩 开发体验 | 自动补全、IDE 提示、重构更方便 | 缺少类型提示,容易漏写 |
6、鸿蒙中的context的作用
定义:在 鸿蒙(HarmonyOS) 中,Context
是一个非常重要的概念,它通常代表了应用或系统中的上下文环境。Context
在鸿蒙应用开发中充当了一个桥梁的角色,负责管理应用或服务的环境,提供多种操作应用资源、界面、数据等的能力。
具体作用/用法:
1、应用上下文管理
Context
保存了应用的环境信息,提供了访问应用、资源和系统服务的能力。在大多数情况下,Context
是与应用生命周期、资源加载和系统交互密切相关的。- 在鸿蒙中,
Context
类可以是AbilityContext
或Context
,分别代表应用的能力上下文和一般上下文。
2、资源访问
Context
允许你访问应用的资源文件,比如字符串、图片、布局等。通过 Context
,可以获取系统资源,如访问系统的配置、语言设置等。
let context = this.context;
let resourceValue = context.getString(ResourceTable.String.hello_world); // 获取字符串资源
3、 应用组件启动
Context
还用于启动和管理应用的各个 能力(Ability)。在鸿蒙中,能力是应用中的独立组件,Context
提供了启动、停止或与其他能力进行交互的接口。
this.context.startAbility({
want: {
bundleName: 'com.example.target',
abilityName: 'com.example.target.MainAbility'
}
});
在这个例子中,Context
允许你启动另一个应用中的能力。
4、服务和广播
Context
还用于管理和发送 广播消息,使得应用能够发送或接收特定的消息和通知。它也允许你通过 Context
获取系统服务(如音频管理、网络状态等)。
let connectivityManager = this.context.getSystemService("connectivity");
在这个例子中,我们通过 Context
获取了系统的连接管理服务。
5、权限管理
Context
还与应用的权限系统密切相关。它用于检查和请求权限,帮助应用在运行时管理其所需的权限。
let permissionGranted = this.context.checkSelfPermission("com.example.permission.READ_CONTACTS");
7、单例设计模式及其使用情况,单例模式有什么优缺点、如何在鸿蒙中实现一个单例模式
定义:单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取它。即:
不管你调用多少次,它都只创建一次对象,之后再用的时候都是用的同一个实例。
使用场景:
使用场景 | 原因 |
---|---|
配置管理器(如 app 设置) | 不需要重复创建,节省内存 |
日志记录器 | 所有模块共用一个记录器 |
网络连接、数据库管理类 | 控制连接数量 |
状态管理(如用户登录状态) | 统一管理,避免状态混乱 |
缓存系统、资源池(数据库等资源) | 降低资源消耗,提高性能 |
优点:
- 节省内存:只创建一次实例
- 统一入口:全局访问方便
- 控制资源:避免频繁初始化,提升性能
缺点
- 不利于测试(难 mock)
- 可能隐藏依赖(全局状态)
- 并发访问时要注意线程安全(ArkTS 单线程 UI 模式下问题较少)
实现
class Singleton {
// 1. 静态私有实例,用于保存唯一实例
private static instance: Singleton;
// 2. 私有构造函数,防止外部直接 new Singleton()
private constructor() {
// 初始化代码(如读取配置)
}
// 3. 全局访问点:静态方法获取实例
public static getInstance(): Singleton {
if (!Singleton.instance) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
// 示例方法:单例的功能
public logMessage(message: string): void {
console.log(`[Logger] ${message}`);
}
}
// 使用示例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // 输出 true(同一实例)
instance1.logMessage("Hello, HarmonyOS!"); // 调用单例方法
来源链接:https://www.cnblogs.com/wkin/p/18813718
没有回复内容