鸿蒙开发:异步并发操作

前言

所谓异步,说白了,就是不必等到上一个的执行结果,我们就可以继续执行下一个操作,相对于同步而言,异步操作可以同时处理多个任务,不会因为一个任务的耗时而影响其他任务的执行,从而提高了程序的并发处理能力‌,在实际的开发中,特别是应用启动初始化的时候,为了不阻塞程序,异步的初始化往往是开发中的首选,在鸿蒙当中,我们如何进行异步的并发操作呢?使用系统提供的Promise和async/await便可以轻松搞定。

简单案例

使用setTimeout函数模拟了一个异步操作。

TypeScript 复制代码
private getMessage(): Promise<string> {
    return new Promise((resolve: Function) => {
      setTimeout(() => {
        resolve("===1秒之后打印")
      }, 1000)
    })
  }

书写执行逻辑

TypeScript 复制代码
console.log("===调用前打印")
this.getMessage().then((result) => {
        console.log(result)
})
console.log("===调用后打印")

由于getMessage方法是一个异步操作,打印的情况如下,从以上的模拟代码,就印证了开头所说的,异步不回阻塞下面的程序执行。

本文简单从以下三个方向概述:

1、什么是 Promise

2、异步回调接收成功和失败

3、结合async/await进行使用

4、相关总结

一、什么是Promise

首先,Promise它是一种用于处理异步操作的对象,并且提供了一个状态机制来管理异步操作的不同阶段,使用Promise有两个特点,第一个特点,它可以结合async/await,将异步操作转换为类似于同步操作的风格,第二个特点就是,正常的异步操作,使用回调函数来处理成功或失败的结果。

Promise提供了三种状态,当Promise对象创建后处于pending(进行中)状态,并在异步操作完成后转换为fulfilled(已完成)或rejected(已拒绝)状态,具体的简单案例如下:

TypeScript 复制代码
promise.then((result) => {
  //结果
}).catch((error: BusinessError) => {
  //错误
});

二、异步回调接收成功和失败

异步的回调,主要使用then方法来接收结果,catch方法回调失败结果,如上面的案例一样,需要说明的是then方法可以接收一个参数,也可以接收两个参数,一个参数,表示当Promise对象状态变为fulfilled时,then方法会自动调用这个回调函数,两个参数时,一个处理fulfilled状态的函数,另一个处理rejected状态的函数。

TypeScript 复制代码
promise.then((result) => {
  //结果
}).catch((error: BusinessError) => {
  //错误
});

大家可以去官方api查看,大部分的方法,或多或少都提供了这种方式的操作,比如网络请求,比如数据库操作,等等,可以说司空见惯。

三、结合async/await进行使用

async/await是一种用于处理异步操作的Promise语法糖,正如上面所说的,结合使用,可以将异步操作转换为类似于同步操作的风格,比如前言中的案例中,我们使用async/await,简单改造一下:

TypeScript 复制代码
  private async printLog() {
    console.log("===调用前打印")
    let message = await this.getMessage() //获取消息
    console.log(message)
    console.log("===调用后打印")
  }

以上的代码改为async/await形式后,打印日志如下:

可以清晰的发现,最后的打印,在等待上一个结束完后再执行,这就实现了同步操作。

async函数是一个返回Promise对象的函数,用于表示一个异步操作,在其内部,可以使用await关键字等待一个Promise对象的解析,然后再返回其解析的结果,如果抛出异常,最终会传递给Promise对象的onRejected()方法。

四、相关总结

在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。

TypeScript 复制代码
 private async printLog() {
    try {
      console.log("===调用前打印")
      let message = await this.getMessage() //获取消息
      console.log(message)
      console.log("===调用后打印")
    } catch (e) {
      console.error("===异常信息:" + e);
    }
  }
相关推荐
iceiceiceice33 分钟前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios
TT_Close38 分钟前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
雨白2 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk2 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
TT_Close2 小时前
【Flutter×鸿蒙】一个"插队"技巧,解决90%的 command not found
flutter·harmonyos
LING3 小时前
RN容器启动优化实践
android·react native
恋猫de小郭5 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker10 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴10 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭20 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter