鴻蒙程式設計江湖:非同步程式設計的優勢及 Promise的應用

SameX發表於2024-10-25

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創內容,任何形式的轉載必須註明出處及原作者。

非同步程式設計是指編寫能夠同時執行多個任務,並且不會阻塞主執行緒的程式碼。非同步程式設計可以有效地提高應用程式的響應速度和效率,並避免耗時任務阻塞主執行緒,導致應用程式卡頓。
Promise 是 JavaScript 中用於處理非同步操作的通用模式,它允許開發者以更簡潔的方式編寫非同步程式碼。

Promise 的定義與使用

Promise 定義
Promise 是一個物件,它代表了非同步操作的結果。Promise 有三種狀態:pending(進行中)、fulfilled(已完成)和 rejected(已拒絕)。
Promise 使用

  • 建立 Promise
const promise = new Promise((resolve, reject) => {
  // 非同步操作的程式碼
});
  • 使用 then 方法
promise.then((result) => {
  // 處理成功的回撥
}).catch((error) => {
  // 處理失敗的回撥
});
  • 使用 async/await
async function myAsyncFunction() {
  const result = await promise;
  // 處理結果
}

async/await 在 ArkTS 中的非同步處理

ArkTS 支援使用 async/await 語法進行非同步處理。async/await 是一種更簡潔的非同步程式設計方式,它使得非同步程式碼看起來更像是同步程式碼。
示例

async function myAsyncFunction() {
  const result = await new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Hello, world!');
    }, 3000);
  });
  console.log(result);
}

async/await 注意事項

  • async 函式必須返回一個 Promise 物件。
  • await 關鍵字只能用在 async 函式內部。

錯誤處理與效能最佳化

錯誤處理

  • 使用 Promise 的 catch 方法捕獲錯誤。
  • 使用 try/catch 塊捕獲非同步操作中的異常。
    效能最佳化
  • 避免在非同步操作中執行耗時操作。
  • 使用 Promise.all 方法並行執行多個非同步操作。

多個 Promise 並行執行與錯誤捕獲的程式碼示例

以下是一個簡單的示例,演示如何在鴻蒙中使用 Promise 和 async/await 並行執行多個非同步操作,並捕獲錯誤:

import { taskpool } from '@kit.ArkTS';
@Concurrent
function add(num1: number, num2: number): number {
  return num1 + num2;
}
@Concurrent
function subtract(num1: number, num2: number): number {
  return num1 - num2;
}
async function concurrentFunc() {
  try {
    const task1 = new taskpool.Task(add, 1, 2);
    const task2 = new taskpool.Task(subtract, 3, 4);
    const results = await Promise.all([taskpool.execute(task1), taskpool.execute(task2)]);
    console.log(results); // 列印結果陣列
  } catch (e) {
    console.error("Error: " + e);
  }
}
@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            concurrentFunc();
          })
          .width('100%');
      }
    }
    .height('100%');
  }
}

這段程式碼定義了一個名為 Index 的元件,並在元件中顯示了一條文字訊息 "Hello World"。點選按鈕會執行 concurrentFunc 函式,該函式建立兩個併發任務並並行執行它們。任務完成後,會在控制檯輸出結果陣列。如果發生錯誤,會捕獲錯誤並列印錯誤資訊。

總結

透過以上介紹,您可以瞭解到鴻蒙系統中非同步程式設計的兩種方式:Promise 和 async/await。使用非同步程式設計可以有效地提高應用程式的響應速度和效率,並避免耗時任務阻塞主執行緒。希望本文能夠幫助您掌握鴻蒙系統中的非同步程式設計技術,並開發出更優秀的鴻蒙應用。

相關文章