ArkTS:高效并发策略,加速应用响应与帧率

并发是指在同一时间内,存在多个任务同时执行的情况。对于多核设备,这些任务可能同时在不同CPU上并行执行。对于单核设备,多个并发任务不会在同一时刻并行执行,但是CPU会在某个任务休眠或进行I/O操作等状态下切换任务,调度执行其他任务,提升CPU的资源利用率。

为了提升应用的响应速度与帧率,避免耗时任务对UI主线程的影响,ArkTS提供了异步并发和多线程并发两种处理策略。

ArkTS 异步并发 (Promise和async/await) 

Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。无需另外启动线程执行。

异步语法是一种编程语言的特性,允许程序在执行某些操作时不必等待其完成,而是可以继续执行其他操作。

1. Promise

        Promise有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)

2. async/await

        async/await是一种用于处理异步操作的Promise语法糖,使得编写异步代码变得更加简单和易读。

1. Promise

1. Promise:有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已拒绝)。2. Promise:对象创建后处于pending状态,并在异步操作完成后转换为fulfilled或rejected状态

以下代码创建了一个Promise对象并模拟了一个异步操作:

下述代码中,setTimeout函数模拟了一个异步操作,并在1秒钟后随机生成一个数字。如果随机数大于0.5,则执行resolve回调函数并将随机数作为参数传递;否则执行reject回调函数并传递一个错误对象作为参数

const promise: Promise<number> = new Promise((resolve: Function, reject: Function) => {
  setTimeout(() => {
    const randomNumber: number = Math.random();
    if (randomNumber > 0.5) {
      resolve(randomNumber);
    } else {
      reject(new Error('Random number is too small'));
    }
  }, 1000);
})

如果randomNumber大于0.5 则执行resolve成功回调函数并将随机数作为参数传递 下面展示成功的回调

promise.then 获取成功的回调

promise.catch 获取失败的回调

import { BusinessError } from '@kit.BasicServicesKit';

//如果执行
promise.then((result: number) => {
 console.info(`Random number is ${result}`);
}).catch((error: BusinessError) => {
 console.error(error.message);
});

2.async/await

async/await是一种用于处理异步操作的Promise语法糖,使得编写异步代码变得更加简单和易读。通过使用async关键字声明一个函数为异步函数,并使用await关键字等待Promise的解析(完成或拒绝),以同步的方式编写异步操作的代码。

下面代码 模拟了一个以同步方式执行异步操作的场景,该操作会在3秒钟后返回一个字符串。

function myAsyncFunction(): Promise<string> {
  return new Promise((resolve: Function) => {
    setTimeout(() => {
      resolve('Hello, world!');
    }, 3000);
  });
}

@Entry
@Component
struct Promise_dome {
  @State message: string = 'Hello World';
  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(async () => {
             //这里使用了Promise语法糖async/await
            let res = await myAsyncFunction();
            console.info("延迟3秒返回的数据: " + res);
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

除了在async函数中使用await外,还可以使用try/catch块来捕获异步操作中的异常。

async function myAsyncFunction2(): Promise<void> {
  try {
    const result: string = await new Promise((resolve: Function, reject: Function) => {
      reject('我报错啦~~~~~');
    });
  } catch (e) {
    console.error(`我看到你报错啦~~~~~: ${e}`);
  }
}

制作不易 点个关注再走吧。°(°¯᷄◠¯᷅°)°。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐