0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS如何使用異步并發(fā)能力進(jìn)行開(kāi)發(fā)

王程 ? 來(lái)源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-18 09:18 ? 次閱讀

一、并發(fā)概述

并發(fā)是指在同一時(shí)間段內(nèi),能夠處理多個(gè)任務(wù)的能力。為了提升應(yīng)用的響應(yīng)速度與幀率,以及防止耗時(shí)任務(wù)對(duì)主線程的干擾,HarmonyOS系統(tǒng)提供了異步并發(fā)和多線程并發(fā)兩種處理策略。

? ● 異步并發(fā)是指異步代碼在執(zhí)行到一定程度后會(huì)被暫停,以便在未來(lái)某個(gè)時(shí)間點(diǎn)繼續(xù)執(zhí)行,這種情況下,同一時(shí)間只有一段代碼在執(zhí)行。

? ● 多線程并發(fā)允許在同一時(shí)間段內(nèi)同時(shí)執(zhí)行多段代碼。在主線程繼續(xù)響應(yīng)用戶操作和更新UI的同時(shí),后臺(tái)也能執(zhí)行耗時(shí)操作,從而避免應(yīng)用出現(xiàn)卡頓。

并發(fā)能力在多種場(chǎng)景中都有應(yīng)用,其中包括單次I/O任務(wù)、CPU密集型任務(wù)、I/O密集型任務(wù)和同步任務(wù)等。開(kāi)發(fā)者可以根據(jù)不同的場(chǎng)景,選擇相應(yīng)的并發(fā)策略進(jìn)行優(yōu)化和開(kāi)發(fā)。

ArkTS支持異步并發(fā)和多線程并發(fā)。

? ● Promise和async/await提供異步并發(fā)能力,適用于單次I/O任務(wù)的開(kāi)發(fā)場(chǎng)景。詳細(xì)請(qǐng)參見(jiàn)異步并發(fā)概述。

? ● TaskPool和Worker提供多線程并發(fā)能力,適用于CPU密集型任務(wù)、I/O密集型任務(wù)和同步任務(wù)等并發(fā)場(chǎng)景。詳細(xì)請(qǐng)參見(jiàn)多線程并發(fā)概述。

二、 使用異步并發(fā)能力進(jìn)行開(kāi)發(fā)

1、異步并發(fā)概述

Promise和async/await提供異步并發(fā)能力,是標(biāo)準(zhǔn)的JS異步語(yǔ)法。異步代碼會(huì)被掛起并在之后繼續(xù)執(zhí)行,同一時(shí)間只有一段代碼執(zhí)行,適用于單次I/O任務(wù)的場(chǎng)景開(kāi)發(fā),例如一次網(wǎng)絡(luò)請(qǐng)求、一次文件讀寫等操作。

異步語(yǔ)法是一種編程語(yǔ)言的特性,允許程序在執(zhí)行某些操作時(shí)不必等待其完成,而是可以繼續(xù)執(zhí)行其他操作。

1.1 Promise

Promise是一種用于處理異步操作的對(duì)象,可以將異步操作轉(zhuǎn)換為類似于同步操作的風(fēng)格,以方便代碼編寫和維護(hù)。Promise提供了一個(gè)狀態(tài)機(jī)制來(lái)管理異步操作的不同階段,并提供了一些方法來(lái)注冊(cè)回調(diào)函數(shù)以處理異步操作的成功或失敗的結(jié)果。

Promise有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已完成)和rejected(已拒絕)。Promise對(duì)象創(chuàng)建后處于pending狀態(tài),并在異步操作完成后轉(zhuǎn)換為fulfilled或rejected狀態(tài)。

最基本的用法是通過(guò)構(gòu)造函數(shù)實(shí)例化一個(gè)Promise對(duì)象,同時(shí)傳入一個(gè)帶有兩個(gè)參數(shù)的函數(shù),通常稱為executor函數(shù)。executor函數(shù)接收兩個(gè)參數(shù):resolve和reject,分別表示異步操作成功和失敗時(shí)的回調(diào)函數(shù)。例如,以下代碼創(chuàng)建了一個(gè)Promise對(duì)象并模擬了一個(gè)異步操作:

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函數(shù)模擬了一個(gè)異步操作,并在1秒鐘后隨機(jī)生成一個(gè)數(shù)字。如果隨機(jī)數(shù)大于0.5,則執(zhí)行resolve回調(diào)函數(shù)并將隨機(jī)數(shù)作為參數(shù)傳遞;否則執(zhí)行reject回調(diào)函數(shù)并傳遞一個(gè)錯(cuò)誤對(duì)象作為參數(shù)。

Promise對(duì)象創(chuàng)建后,可以使用then方法和catch方法指定fulfilled狀態(tài)和rejected狀態(tài)的回調(diào)函數(shù)。then方法可接受兩個(gè)參數(shù),一個(gè)處理fulfilled狀態(tài)的函數(shù),另一個(gè)處理rejected狀態(tài)的函數(shù)。只傳一個(gè)參數(shù)則表示狀態(tài)改變就執(zhí)行,不區(qū)分狀態(tài)結(jié)果。使用catch方法注冊(cè)一個(gè)回調(diào)函數(shù),用于處理“失敗”的結(jié)果,即捕獲Promise的狀態(tài)改變?yōu)閞ejected狀態(tài)或操作失敗拋出的異常。例如:

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

上述代碼中,then方法的回調(diào)函數(shù)接收Promise對(duì)象的成功結(jié)果作為參數(shù),并將其輸出到控制臺(tái)上。如果Promise對(duì)象進(jìn)入rejected狀態(tài),則catch方法的回調(diào)函數(shù)接收錯(cuò)誤對(duì)象作為參數(shù),并將其輸出到控制臺(tái)上。

1.2 async/await

async/await是一種用于處理異步操作的Promise語(yǔ)法糖,使得編寫異步代碼變得更加簡(jiǎn)單和易讀。通過(guò)使用async關(guān)鍵字聲明一個(gè)函數(shù)為異步函數(shù),并使用await關(guān)鍵字等待Promise的解析(完成或拒絕),以同步的方式編寫異步操作的代碼。

async函數(shù)是一個(gè)返回Promise對(duì)象的函數(shù),用于表示一個(gè)異步操作。在async函數(shù)內(nèi)部,可以使用await關(guān)鍵字等待一個(gè)Promise對(duì)象的解析,并返回其解析值。如果一個(gè)async函數(shù)拋出異常,那么該函數(shù)返回的Promise對(duì)象將被拒絕,并且異常信息會(huì)被傳遞給Promise對(duì)象的onRejected()方法。

下面是一個(gè)使用async/await的例子,其中模擬了一個(gè)異步操作,該操作會(huì)在3秒鐘后返回一個(gè)字符串。

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

myAsyncFunction();

在上述示例代碼中,使用了await關(guān)鍵字來(lái)等待Promise對(duì)象的解析,并將其解析值存儲(chǔ)在result變量中。

需要注意的是,由于要等待異步操作完成,因此需要將整個(gè)操作包在async函數(shù)中。除了在async函數(shù)中使用await外,還可以使用try/catch塊來(lái)捕獲異步操作中的異常。

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

myAsyncFunction();

2、 單次I/O任務(wù)開(kāi)發(fā)指導(dǎo)

Promise和async/await提供異步并發(fā)能力,適用于單次I/O任務(wù)的場(chǎng)景開(kāi)發(fā),本文以使用異步進(jìn)行單次文件寫入為例來(lái)提供指導(dǎo)。

? 1. 實(shí)現(xiàn)單次I/O任務(wù)邏輯。

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. 采用異步能力調(diào)用單次I/O任務(wù)。示例中的filePath的獲取方式請(qǐng)參見(jiàn)獲取應(yīng)用文件路徑。

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

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 并發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2498
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1975

    瀏覽量

    30209
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)概述

    ArkTS語(yǔ)言基礎(chǔ)類庫(kù)是HarmonyOS系統(tǒng)上為應(yīng)用開(kāi)發(fā)者提供的常用基礎(chǔ)能力,主要包含能力如下圖所示。 1.提供異步
    發(fā)表于 03-05 15:42

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)異步并發(fā)簡(jiǎn)述Promise

    Promise和async/await提供異步并發(fā)能力,是標(biāo)準(zhǔn)的JS異步語(yǔ)法。異步代碼會(huì)被掛起并在之后繼續(xù)執(zhí)行,同一時(shí)間只有一段代碼執(zhí)行,適
    發(fā)表于 03-07 15:46

    HarmonyOS應(yīng)用服務(wù)調(diào)試能力資料合集

    IDL實(shí)現(xiàn)的跨設(shè)備場(chǎng)景,開(kāi)發(fā)者在如下表中的方法處設(shè)置斷點(diǎn),當(dāng)中斷到該斷點(diǎn)處,執(zhí)行 Step Into 即可進(jìn)入到被調(diào)用方法的實(shí)現(xiàn)處。2、使用真機(jī)進(jìn)行調(diào)試HarmonyOS使用真機(jī)設(shè)備進(jìn)行
    發(fā)表于 03-25 11:31

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)API-ConnectOptions能力

    說(shuō)明: 在連接指定的后臺(tái)服務(wù)時(shí)作為入?yún)⒂糜诮邮者B接過(guò)程中的狀態(tài)變化。 編譯環(huán)境: 編譯器版本:release3.0 Api:8 語(yǔ)言:js 示例 *附件:HarmonyOSOpenHarmony應(yīng)用開(kāi)發(fā)API-ConnectOptions
    發(fā)表于 05-08 17:29

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-ArkTSAPI系統(tǒng)能力SystemCapability

    ,隨著目標(biāo)設(shè)備是否支持該系統(tǒng)能力共同存在或消失,也會(huì)隨著DevEco Studio一起提供給開(kāi)發(fā)者做聯(lián)想。 開(kāi)發(fā)者可以在系統(tǒng)能力SystemCapability列表中查詢
    發(fā)表于 08-10 16:39

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

    者預(yù)覽版及相關(guān)的開(kāi)發(fā)套件的新能力進(jìn)行了詳細(xì)介紹。 華為終端BG軟件部副總裁龔繼華在開(kāi)發(fā)者主題演講開(kāi)場(chǎng)時(shí)表示,HarmonyOS的快速迭代和
    發(fā)表于 08-14 15:08

    HarmonyOS如何使用異步并發(fā)能力進(jìn)行開(kāi)發(fā)

    策略進(jìn)行優(yōu)化和開(kāi)發(fā)。 ArkTS支持異步并發(fā)和多線程并發(fā)。 ● Promise和async/await提供
    發(fā)表于 09-22 17:35

    HarmonyOS使用多線程并發(fā)能力開(kāi)發(fā)

    代表,不需要開(kāi)發(fā)者去面對(duì)鎖帶來(lái)的一系列復(fù)雜偶發(fā)的問(wèn)題,同時(shí)并發(fā)度也相對(duì)較高,因此得到了廣泛的支持和使用,也是當(dāng)前ArkTS語(yǔ)言選擇的并發(fā)模型。 由于Actor模型的內(nèi)存隔離特性,所以需要進(jìn)行
    發(fā)表于 09-25 15:23

    HarmonyOS語(yǔ)言基礎(chǔ)類庫(kù)開(kāi)發(fā)指南上線啦!

    基礎(chǔ)類庫(kù)開(kāi)發(fā)指南為HarmonyOS應(yīng)用開(kāi)發(fā)者提供了常用的基礎(chǔ)能力: ○ 提供異步并發(fā)和多線程
    發(fā)表于 10-18 16:36

    2021華為開(kāi)發(fā)者大會(huì)亮點(diǎn) HarmonyOS架構(gòu)演進(jìn)與關(guān)鍵技術(shù)-HarmonyOS對(duì)DFX能力的要求是什么

    2021華為開(kāi)發(fā)者大會(huì)亮點(diǎn) HarmonyOS架構(gòu)演進(jìn)與關(guān)鍵技術(shù)-HarmonyOS對(duì)DFX能力的要求是什么 HarmonyOS對(duì)DFX
    的頭像 發(fā)表于 10-23 11:31 ?2574次閱讀
    2021華為<b class='flag-5'>開(kāi)發(fā)</b>者大會(huì)亮點(diǎn) <b class='flag-5'>HarmonyOS</b>架構(gòu)演進(jìn)與關(guān)鍵技術(shù)-<b class='flag-5'>HarmonyOS</b>對(duì)DFX<b class='flag-5'>能力</b>的要求是什么

    HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS圖形棧整體架構(gòu)和測(cè)試能力

    HDC 2021華為開(kāi)發(fā)者大會(huì)HarmonyOS測(cè)試技術(shù)與實(shí)戰(zhàn)-HarmonyOS圖形棧整體架構(gòu)和測(cè)試能力
    的頭像 發(fā)表于 10-23 15:11 ?1428次閱讀
    <b class='flag-5'>HarmonyOS</b>測(cè)試技術(shù)與實(shí)戰(zhàn)-<b class='flag-5'>HarmonyOS</b>圖形棧整體架構(gòu)和測(cè)試<b class='flag-5'>能力</b>

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

    開(kāi)發(fā)者預(yù)覽版及相關(guān)的開(kāi)發(fā)套件的新能力進(jìn)行了詳細(xì)介紹。 持續(xù)聽(tīng)取開(kāi)發(fā)者心聲,HarmonyOS面向
    的頭像 發(fā)表于 08-09 17:16 ?1293次閱讀

    HarmonyOS NEXT新能力,一站式高效開(kāi)發(fā)HarmonyOS應(yīng)用

    2023年8月6日華為開(kāi)發(fā)者大會(huì)2023(HDC.Together)圓滿收官,伴隨著HarmonyOS 4的發(fā)布,華為向開(kāi)發(fā)者發(fā)布了匯聚所有最新開(kāi)發(fā)
    的頭像 發(fā)表于 08-11 12:10 ?1055次閱讀

    HarmonyOS語(yǔ)言基礎(chǔ)類庫(kù)開(kāi)發(fā)指南上線啦!

    語(yǔ)言基礎(chǔ)類庫(kù)提供哪些功能?多線程并發(fā)如何實(shí)現(xiàn)?TaskPool(任務(wù)池)和Worker在實(shí)現(xiàn)和使用場(chǎng)景上有何不同? 針對(duì)開(kāi)發(fā)者關(guān)注的并發(fā)等語(yǔ)言基礎(chǔ)類庫(kù)的相關(guān)能力,我們?cè)谛峦瞥龅恼Z(yǔ)言基礎(chǔ)
    的頭像 發(fā)表于 10-18 16:20 ?585次閱讀
    <b class='flag-5'>HarmonyOS</b>語(yǔ)言基礎(chǔ)類庫(kù)<b class='flag-5'>開(kāi)發(fā)</b>指南上線啦!

    鴻蒙OS開(kāi)發(fā)實(shí)例:【ArkTS類庫(kù)異步并發(fā)簡(jiǎn)述Promise】

    Promise和async/await提供異步并發(fā)能力,是標(biāo)準(zhǔn)的JS異步語(yǔ)法。異步代碼會(huì)被掛起并在之后繼續(xù)執(zhí)行,同一時(shí)間只有一段代碼執(zhí)行,適
    的頭像 發(fā)表于 04-02 18:37 ?978次閱讀
    鴻蒙OS<b class='flag-5'>開(kāi)發(fā)</b>實(shí)例:【ArkTS類庫(kù)<b class='flag-5'>異步</b><b class='flag-5'>并發(fā)</b>簡(jiǎn)述Promise】