首页 > 编程语言 >鸿蒙编程江湖:异步编程的优势及 Promise的应用

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

时间:2024-10-25 12:58:51浏览次数:1  
标签:异步 await 鸿蒙 编程 Promise async

本文旨在深入探讨华为鸿蒙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。使用异步编程可以有效地提高应用程序的响应速度和效率,并避免耗时任务阻塞主线程。希望本文能够帮助您掌握鸿蒙系统中的异步编程技术,并开发出更优秀的鸿蒙应用。

标签:异步,await,鸿蒙,编程,Promise,async
From: https://www.cnblogs.com/samex/p/18502284

相关文章

  • 鸿蒙编程江湖:并发编程基础与鸿蒙中的任务并发
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。并发编程是指在同一时间段内处理多个任......
  • Node.js和Python在服务器端编程上有什么不同
    Node.js和Python在服务器端编程上有以下不同:1.设计哲学不同;2.性能不同;3.库支持和框架不同;4.同步/异步处理不同;5.语法简洁性不同;6.用途和适用场景不同。具体来说,Node.js基于事件驱动和非阻塞I/O模型,优于高并发处理,而Python则以简洁易读著称,广泛应用于科学计算、人工智能等领域。......
  • Swift 中如何利用闭包实现异步回调?
    在Swift中,闭包是自包含的函数代码块,可以在代码中被传递和使用。它们非常适合用于实现异步回调,主要因为闭包能够捕获和存储其所在上下文中的任何常量和变量的引用。异步回调的实现步骤如下:1、 定义一个接受闭包作为参数的函数。这个闭包的类型取决于你期望的回调数据类型和逻辑。......
  • Promise的用途是什么
    Promise的用途是:1、避免回调地狱;2、错误处理;3、状态管理;4、多个异步操作的处理;5、执行顺序的控制;6、与async/await的配合使用。Promise的链式调用,可以避免回调地狱,使代码更加优雅和清晰。通过Promise的catch方法,可以统一处理链上任何位置的错误。还有Promise.all和Promise.race方......
  • unix网络编程:解决小型聊天室的用户私发消息问题
    今天老师布置了一个在线聊天室用户私发消息的问题思路:在服务端的用户链表中找到要私发的用户名,用其节点里的套接字号发消息,就可以达到私发的效果。运行效果:可以看到,Tom给Bill、Lily群发一个问候消息,Lily私发消息回应Tom。客户端代码:#include<stdio.h>#include<stri......
  • 鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题
    1.TCP数据传输粘包简介在本系列的第6篇文章《鸿蒙网络编程系列6-TCP数据粘包表现及原因分析》中,我们演示了TCP数据粘包的表现,如图所示:随后解释了粘包背后的可能原因,并给出了解决TCP传输粘包问题的两种思路,其中一种就是指定数据包结束标志,本节将通过一个示例演示这种思路......
  • 为什么有些编程语言不建议用下划线作为标识符开头?标识符的特殊字符。为什么不指定编
    为什么有些编程语言不建议用下划线作为标识符开头?C/C++中两个下划线开头的标识符可能是预留给运行时库的保留字。写代码的时候,就建议最好不要用下划线开头的标识符,避免冲突。最怕的是,编译器没提示错误,运行时产生奇怪的结果。......
  • 编程语言有哪些分类?C语言和其他编程语言的区别?到底什么是高级语言,什么是低级语言?C
    编程语言有哪些分类?编程语言发展有打孔卡片、机器语言、汇编语言和高级语言这几种形态。高级语言对于程序员更友好,发展的形态五花八门。从编程方式看,有命令式、函数式和逻辑式三种。命令式以常见的C/C++/Java/C#/Py......
  • 网络编程(Day34)
    一、学习内容网络发展历史发展阶段1.APRAnet阶段---冷战产物2.TCP/IP协议阶段--只有TCP和IP两个协议3.osi开放系统互联模型4.TCP/IP协议族(重要)5.量子通信(可能)TCP/IP两个协议阶段概念在计算机网络中,要做到有条不紊的交换数据,需要遵循一些事先约定好的规则......
  • 面试华为遇到了经典动态规划题 - 怎么用go、C++进行编程解决
    华为的知名很大程度上源自于在经历过被美国的制裁和打压后不仅撑住了,而且还做出了相对于自己来说技术进步程度很大的芯片​。这是一个不小的成绩​。从个人的角度上来说,华为是最难进的一家大公司之一,它的面试标准很严格​。这不仅是筛选人才,在某种程度上来说也是由于求职市场......