HarmonyOS 如何使用异步并发能力进行开发

news/2024/7/21 8:44:06 标签: HarmonyOS

一、并发概述

并发是指在同一时间段内,能够处理多个任务的能力。为了提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰,HarmonyOS 系统提供了异步并发和多线程并发两种处理策略。

● 异步并发是指异步代码在执行到一定程度后会被暂停,以便在未来某个时间点继续执行,这种情况下,同一时间只有一段代码在执行。

● 多线程并发允许在同一时间段内同时执行多段代码。在主线程继续响应用户操作和更新 UI 的同时,后台也能执行耗时操作,从而避免应用出现卡顿。

并发能力在多种场景中都有应用,其中包括单次 I/O 任务、CPU 密集型任务、I/O 密集型任务和同步任务等。开发者可以根据不同的场景,选择相应的并发策略进行优化和开发。

ArkTS 支持异步并发和多线程并发。

● Promise 和 async/await 提供异步并发能力,适用于单次 I/O 任务的开发场景。详细请参见异步并发概述。

● TaskPool 和 Worker 提供多线程并发能力,适用于 CPU 密集型任务、I/O 密集型任务和同步任务等并发场景。详细请参见多线程并发概述。

二、  使用异步并发能力进行开发

1、  异步并发概述

Promise 和 async/await 提供异步并发能力,是标准的 JS 异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次 I/O 任务的场景开发,例如一次网络请求、一次文件读写等操作。

异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作。

1.1 Promise

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

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

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

const promise = new Promise((resolve, reject) => {  setTimeout(() => {    const randomNumber = Math.random();    if (randomNumber > 0.5) {      resolve(randomNumber);    } else {      reject(new Error('Random number is too small'));    }  }, 1000);});

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

Promise 对象创建后,可以使用 then 方法和 catch 方法指定 fulfilled 状态和 rejected 状态的回调函数。then 方法可接受两个参数,一个处理 fulfilled 状态的函数,另一个处理 rejected 状态的函数。只传一个参数则表示状态改变就执行,不区分状态结果。使用 catch 方法注册一个回调函数,用于处理“失败”的结果,即捕获 Promise 的状态改变为 rejected 状态或操作失败抛出的异常。例如:

promise.then(result => {  console.info(`Random number is ${result}`);}).catch(error => {  console.error(error.message);});

上述代码中,then 方法的回调函数接收 Promise 对象的成功结果作为参数,并将其输出到控制台上。如果 Promise 对象进入 rejected 状态,则 catch 方法的回调函数接收错误对象作为参数,并将其输出到控制台上。

1.2 async/await

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

async 函数是一个返回 Promise 对象的函数,用于表示一个异步操作。在 async 函数内部,可以使用 await 关键字等待一个 Promise 对象的解析,并返回其解析值。如果一个 async 函数抛出异常,那么该函数返回的 Promise 对象将被拒绝,并且异常信息会被传递给 Promise 对象的 onRejected()方法。

下面是一个使用 async/await 的例子,其中模拟了一个异步操作,该操作会在 3 秒钟后返回一个字符串。

async function myAsyncFunction() {  const result = await new Promise((resolve) => {    setTimeout(() => {      resolve('Hello, world!');    }, 3000);  });  console.info(String(result)); // 输出: Hello, world!}
myAsyncFunction();

在上述示例代码中,使用了 await 关键字来等待 Promise 对象的解析,并将其解析值存储在 result 变量中。

需要注意的是,由于要等待异步操作完成,因此需要将整个操作包在 async 函数中。除了在 async 函数中使用 await 外,还可以使用 try/catch 块来捕获异步操作中的异常。

async function myAsyncFunction() {  try {    const result = await new Promise((resolve) => {      resolve('Hello, world!');    });  } catch (e) {    console.error(`Get exception: ${e}`);  }}
myAsyncFunction();

2、  单次 I/O 任务开发指导

Promise 和 async/await 提供异步并发能力,适用于单次 I/O 任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。

1.  实现单次 I/O 任务逻辑。

import fs from '@ohos.file.fs';
async function write(data: string, filePath: string) {  let file = await fs.open(filePath, fs.OpenMode.READ_WRITE);  fs.write(file.fd, data).then((writeLen) => {    fs.close(file);  }).catch((err) => {    console.error(`Failed to write data. Code is ${err.code}, message is ${err.message}`);  })}

2.  采用异步能力调用单次 I/O 任务。示例中的 filePath 的获取方式请参见获取应用文件路径。

let filePath = ...; // 应用文件路径write('Hello World!', filePath).then(() => {  console.info('Succeeded in writing data.');})

http://www.niftyadmin.cn/n/5043622.html

相关文章

算法基础之高精度总结

目录 高精度算法分类 高精度加减乘除的异同点 加和乘 相同点 减和除 相同点 不同点 处理前导0的方式 高精度算法分类 分类:加、减、乘、除 其中加减乘都适用于两个数都是高精度,除法因为除数是高精度的话不好用整除的方法,所以除法时…

matlab符号函数

一、符号函数简介 符号函数是matlab的一个重要功能,可以用来表示数学上的函数,同时也可以用来进行数值计算。 创建符号函数的方法: 利用syms定义符号变量生成符号函数利用sym和生成符号函数利用函数文件生成符号函数 1.1 syms方法 首先利…

深度学习中的激活函数 – 完整概述

1.什么是激活函数? 生物神经网络启发了人工神经网络的发展。然而,人工神经网络甚至不能近似代表大脑的工作方式。在我们知道为什么在人工神经网络中使用激活函数之前,了解生物神经网络中激活函数的相关性仍然很有用。 典型的神经元具有由细胞体、向其他神经元发送信息的轴…

Uts阿里百川旗舰版插件UniApp-X

简介: 此插件为Uts插件,1.0版暂只支持安卓 插件地址:https://ext.dcloud.net.cn/plugin?id14771 接入阿里百川安卓旗舰版最新版5.0.1.9!支持淘宝授权登录,获取登录用户信息,拉起淘宝,打开商…

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LE CIS 同步通信 同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LE AUDIO使用同步通信。 当使用同步通信时,数据具有有限的时间有效期,在到期时被认…

少儿编程 2023年5月中国电子学会图形化编程等级考试Scratch编程三级真题解析(选择题)

2023年5月scratch编程等级考试三级真题 选择题(共25题,每题2分,共50分) 1、关于变量,下列描述错误的是 A、只能建一个变量 B、变量可以隐藏 C、变量可以删除 D、变量的值可以修改 答案:A 考点分析:考查变量相关知识 变量可以根据题目的需要建立多个,所以答案A错…

SMB:使用 Ansible 自动化配置 samba 客户端服务端

写在前面 考试顺便整理博文内容整理 使用 Ansible 部署 samba 客户端和服务端理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的&#xff0c…

JUC第七讲:关键字final详解

JUC第七讲:关键字final详解 final 关键字看上去简单,但是真正深入理解的人可以说少之又少。本文是JUC第七讲:关键字final详解,将常规的用法简化,提出一些用法和深入的思考。 文章目录 JUC第七讲:关键字fina…