鸿蒙开发:异步并发操作

前言

所谓异步,说白了,就是不必等到上一个的执行结果,我们就可以继续执行下一个操作,相对于同步而言,异步操作可以同时处理多个任务,不会因为一个任务的耗时而影响其他任务的执行,从而提高了程序的并发处理能力‌,在实际的开发中,特别是应用启动初始化的时候,为了不阻塞程序,异步的初始化往往是开发中的首选,在鸿蒙当中,我们如何进行异步的并发操作呢?使用系统提供的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);
    }
  }
相关推荐
alexhilton2 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
chinesegf2 小时前
iTunes Lookup API 规则具体(查包名)
ios
周胡杰2 小时前
鸿蒙preferences单多例使用,本地存储类
缓存·华为·harmonyos·preferences·鸿蒙本地存储
ji_shuke2 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
IvanCodes2 小时前
[鸿蒙2025领航者闯关] 共享终端的隐形守护者:基于 HarmonyOS 6 的全链路隐私闭环实战
华为·harmonyos·鸿蒙
sunnyday04264 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理5 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台6 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐6 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极6 小时前
Android Jetpack Compose折叠屏感知与适配
android