一、鸿蒙中同步代码与异步代码的核心区别与实现解析

在鸿蒙(HarmonyOS)开发中,同步代码与异步代码的运行机制和应用场景存在显著差异。以下从多个维度对比两者的特性,并结合鸿蒙实际开发案例进行说明:

1、运行机制对比
特性​ ​同步代码​ ​异步代码​
​执行方式​ 顺序执行,当前操作完成前阻塞后续代码(如排队处理)

非阻塞执行,通过事件循环或后台线程处理(如多车道并行)

​线程模型​ 单线程顺序执行 可基于主线程事件循环或多线程并发

​性能影响​ 可能导致界面卡顿(耗时操作阻塞主线程)

提升响应速度(耗时操作在后台执行)

​典型场景​ 简单数学运算、实时数据校验

网络请求、文件读写、数据库操作

2、运行机制对比

同步代码:逐行执行,需原地等待结果后,才继续向下执行
异步代码:调用后耗时,不阻塞代码继续执行,将来完成后,触发回调函数传递结果
划重点:异步代码的结果,通过 回调函数 获取


二、鸿蒙异步编程实现方案之Promise

1.Promise内容说明

核心机制​​:通过状态机(pending/fulfilled/rejected)管理异步操作生命周期,Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。

Promise是一种用于处理异步操作的对象,可以将异步操作转换为类似于同步操作的风格,以方便代码编写和维护。Promise提供了一个状态机制来管理异步操作的不同阶段,并提供了一些方法来注册回调函数以处理异步操作的成功或失败的结果。

Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。Promise对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected状态。

三种状态如下:

最基本的用法是通过构造函数实例化一个Promise对象,同时传入一个带有两个参数的函数,通常称为executor函数。executor函数接收两个参数:resolve和reject,分别表示异步操作成功和失败时的回调函数。例如,以下代码创建了一个Promise对象并模拟了一个异步操作。

最基本的用法是通过构造函数实例化一个Promise对象,同时传入一个带有两个参数的函数,通常称为executor函数。executor函数接收两个参数:resolve和reject,分别表示异步操作成功和失败时的回调函数。例如,以下代码创建了一个Promise对象并模拟了一个异步操作:

const promise: Promise<number> = new Promise((resolve: Function, reject: Function) => {
  setTimeout(() => {
    const randomNumber: number = Math.random();
    if (randomNumber > 0.5) {
      resolve(randomNumber);
    } else {
      reject(new Error('随机数太小'));
    }
  }, 1000);
})

上述代码中,setTimeout函数模拟了一个异步操作,并在1秒钟后随机生成一个数字。如果随机数大于0.5,则执行resolve回调函数并将随机数作为参数传递;否则执行reject回调函数并传递一个错误对象作为参数。

2.Promise的三个模式:

1.内部执行异步代码

 // 实例化 Promise 对象
  const pm = new Promise<string>(() => {
    // 执行任意代码,主要是异步
    setTimeout(() => {
      // 比如:获取随机数
      const randomNum = Math.floor(Math.random() * 100)
      console.log('随机数是:', randomNum)
    })
  })
}

2.传递成功结果

const pm = new Promise<string>((resolve) => {
    // 执行任意代码,主要是异步
    setTimeout(() => {
      // 比如:获取随机数
      const randomNum = Math.floor(Math.random() * 100)
      resolve(randomNum.toString())
    })
  })

  pm.then(res => {
    console.log('res:', res)
  })

3.传递失败结果

  const pm = new Promise<string>((resolve,reject) => {
      // 执行任意代码,主要是异步
      setTimeout(() => {
        // 比如:获取随机数
        const randomNum = Math.floor(Math.random() * 100)
        // resolve(randomNum.toString())
        reject(randomNum.toString())
      })
    })

    pm.then(res => {
      console.log('res:', res)
    },(err:string)=>{
      console.log('err:',err)
    })

总结提取核心代码:

    const p = new Promise<string>((resolve, reject) => {
      // 执行任意代码,主要是异步
      // 成功 resolve(成功结果) then 执行
      // 失败 reject(失败结果) then第二个回调函数或 catch 执行
    })

    p.then(res => {}, (err: string) => {})
    // 或者
    p.then(res=>{}).catch((err:string)=>{})
3.关于Promise的典型应用场景:
场景​ ​实现方式​ ​优势​
网络请求 封装 axios 请求,通过 resolve 返回响应数据,reject 处理 HTTP 错误码 避免 UI 线程阻塞
文件读写 结合 @ohos.file.fs API,异步读取文件后触发 resolve 提升大文件操作效率
数据库查询 在 executeSql 回调中判断查询结果,成功时传递数据集 简化事务处理逻辑
硬件交互 异步获取传感器数据后更新 UI 保障系统响应流畅度

Promise可以避免回调函数地狱,例如,实现一个列表获取地址功能,需要获取国家,省份,城市和区域,如果一直用req.request('https://xxxxxxxxx') .then方法循环嵌套回调函数的话,代码的可读性会非常糟糕,这时可以使用Promise进行优化,优化效果如下:

promise对象1.then(res1=>{
  promise对象2.then(res2=>{
    promise对象3.then(res3=>{
      promise对象4.then(res4=>{
        //.... 可以一直写下去
      })
    })
  })
})

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐