鸿蒙app面试题1

1、async和await

定义:async/await是一种用于处理异步操作的Promise语法糖,通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。

使用:

  • async:修饰函数,使其返回一个 Promise 对象。若函数内返回非 Promise 值,会自动包装为 Promise.resolve(值)
  • await:只能在 async 函数内使用,会暂停代码执行,等待右侧的 Promise 完成(fulfilledrejected)。
  • 错误处理:用 try/catch 捕获异常。

2、Promise 及其状态

定义:Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,并提供了一些方法来注册回调函数以处理异步操作的成功(resolve)或失败(reject)的结果。

三种状态:

  1. Pending(进行中):初始状态,未完成。
  2. Fulfilled(已成功):操作成功完成,通过 resolve(value) 触发。
  3. Rejected(已失败):操作失败,通过 reject(error) 触发。

状态特性

  • 状态一旦改变(从 PendingFulfilledRejected),不可逆,且仅能从Pending→Fulfilled/Rejected。
  • 通过 .then() 处理成功结果,.catch() 处理错误,.finally() 执行最终逻辑。

3、回调地狱及其解决方案

定义:多层嵌套的回调函数导致的代码难以阅读和维护的情况。

多层嵌套:

getData(function(result1) {
  processData(result1, function(result2) {
    saveData(result2, function(result3) {
      console.log('All done:', result3);
    });
  });
});

解决方案

  1. Promise 链式调用:用 .then() 扁平化代码。

    //根据得到的结果调用不同函数
    
    getData()
      .then(result1 => processData(result1))
      .then(result2 => saveData(result2))
      .then(result3 => {
        console.log('All done:', result3);
      })
      .catch(error => {
        console.error('Error:', error);
      });
    
    
  2. 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 类可以是 AbilityContextContext,分别代表应用的能力上下文和一般上下文。

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

请登录后发表评论

    没有回复内容