DEV Community

SameX
SameX

Posted on

鸿蒙编程江湖:异步编程的优势及 Promise的应用

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

异步编程是指编写能够同时执行多个任务,并且不会阻塞主线程的代码。异步编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程,导致应用程序卡顿。
Promise 是 JavaScript 中用于处理异步操作的通用模式,它允许开发者以更简洁的方式编写异步代码。

Promise 的定义与使用

Promise 定义
Promise 是一个对象,它代表了异步操作的结果。Promise 有三种状态:pending(进行中)、fulfilled(已完成)和 rejected(已拒绝)。
Promise 使用

  • 创建 Promise
const promise = new Promise((resolve, reject) => {
  // 异步操作的代码
});
Enter fullscreen mode Exit fullscreen mode
  • 使用 then 方法
promise.then((result) => {
  // 处理成功的回调
}).catch((error) => {
  // 处理失败的回调
});
Enter fullscreen mode Exit fullscreen mode
  • 使用 async/await
async function myAsyncFunction() {
  const result = await promise;
  // 处理结果
}
Enter fullscreen mode Exit fullscreen mode

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);
}
Enter fullscreen mode Exit fullscreen mode

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%');
  }
}
Enter fullscreen mode Exit fullscreen mode

这段代码定义了一个名为 Index 的组件,并在组件中显示了一条文本消息 "Hello World"。点击按钮会执行 concurrentFunc 函数,该函数创建两个并发任务并并行执行它们。任务完成后,会在控制台输出结果数组。如果发生错误,会捕获错误并打印错误信息。

总结

通过以上介绍,您可以了解到鸿蒙系统中异步编程的两种方式:Promise 和 async/await。使用异步编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的异步编程技术,并开发出更优秀的鸿蒙应用。

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay