关于harmonyos:HarmonyOS如何使用异步并发能力进行开发

79次阅读

共计 3096 个字符,预计需要花费 8 分钟才能阅读完成。

一、并发概述

并发是指在同一时间段内,可能解决多个工作的能力。为了晋升利用的响应速度与帧率,以及避免耗时工作对主线程的烦扰,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}`);
})
}
  1. 采纳异步能力调用单次 I/O 工作。示例中的 filePath 的获取形式请参见获取利用文件门路。
let filePath = ...; // 利用文件门路
write('Hello World!', filePath).then(() => {console.info('Succeeded in writing data.');
})

正文完
 0