HarmonyOS鸿蒙Next有关async使用

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS鸿蒙Next有关async使用 文档描述:Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。

我测试了一下如果同时执行多个async函数时,Promise函数会在全部函数执行完才同时回调,这是不是表示不能大量使用async关键词,但是api基本都是使用async进行异步回调的,例如项目初始化时会用async同时初始化不同的功能api,这样会不会导致初始化的时间增加,还是说async的是有作用范围的,在不同的线程,或者UIAbility里面async是可以并发执行的。

测试代码:

build() {
  Row() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.test1().then(()=>{
            Logger.info('test1>>end')
          })
          this.test2().then(()=>{
            Logger.info('test2>>end')
          })
        })
    }
    .width('100%')
  }
  .height('100%')
}

async test1() {
  const start = Date.now();
  Logger.info('test1>>start')
  while (Date.now() - start < 2000) {
  }
  Logger.info('test1>>return')
  return true
}

async test2() {
  const start = Date.now();
  Logger.info('test2>>start')
  while (Date.now() - start < 5000) {

  }
  Logger.info('test2>>return')
  return true
}

日志信息:

06-17 16:02:46.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test1>>start, %{public}s
06-17 16:02:48.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test1>>return, %{public}s
06-17 16:02:48.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test2>>start, %{public}s
06-17 16:02:53.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test2>>return, %{public}s
06-17 16:02:53.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test1>>end, %{public}s
06-17 16:02:53.585 2604-2604 A0ff00/[Sample_Socket] com.kaipanla.flktest I test2>>end, %{public}s

更多关于HarmonyOS鸿蒙Next有关async使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

使用async/await并不会增加初始化时间,因为async函数本身就是异步的,它会在异步操作完成后返回结果。只有在异步操作完成之前,代码才会被阻塞。因此,初始化时间取决于最慢的异步操作的完成时间,而不会受到async/await的影响。

在鸿蒙OS中,可以同时执行多个async函数。每个async函数都是独立的,不会影响其他async函数的执行顺序或初始化时间。每个async函数都会按照其自身的异步操作进度进行执行,不会因为其他async函数的执行而被阻塞。因此,使用多个async函数不会增加初始化时间,相反会提高代码的并发性和执行效率。

异步函数本来可以并行执行,但a2的执行依赖于a1的结果,那么a2只能放在a1执行完成之后去执行。

如果a1还未执行完,a2已经开始执行的话,此时a2获取到的结果是undefined,对这个undefined进行处理就会报错。

while循环会阻塞代码的执行,test1中while阻塞了test2的开始,test2中while又阻塞了test1结果的获取,所以会导致上述执行顺序出现。可以使用延时器查看代码执行顺序,示例如下:

import { ArrayList } from '@kit.ArkTS';

import fs from '@ohos.file.fs'

@Entry
@Component
struct Index {

 @State message: string = 'Hello World';

 build() {

  Row() {

   Column() {

    Text(this.message)
     .fontSize(50)
     .fontWeight(FontWeight.Bold)
     .onClick(() => {
      this.test1().then(()=>{
       console.log('test1>>end')
      })
      this.test2().then(()=>{
       console.log('test2>>end')
      })
     })

   }
   .width('100%')
  }

  .height('100%')
 }

 test1():Promise<void> {
  return new Promise((resolve,reject)=>{
   const start = Date.now();
   console.log('test1>>start')
   setTimeout(()=>{
    console.log('test1>>return')
    return resolve()
   },2000)
  })
 }

 test2():Promise<void> {
  return new Promise((resolve,reject)=>{
   console.log('test2>>start')
   setTimeout(()=>{
    console.log('test2>>return')
    return resolve()
   },5000)
  })
 }
}

更多关于HarmonyOS鸿蒙Next有关async使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,async关键字用于定义异步函数。异步函数允许开发者在执行耗时操作时,不会阻塞主线程,从而提高应用的响应性能。异步函数通常与await关键字配合使用,await用于等待一个异步操作完成,并返回其结果。

在鸿蒙Next中,异步函数的基本语法如下:

async function myAsyncFunction() {
    // 异步操作
    let result = await someAsyncOperation();
    return result;
}

在上述代码中,myAsyncFunction是一个异步函数,someAsyncOperation是一个异步操作。当await遇到someAsyncOperation时,函数会暂停执行,直到someAsyncOperation完成并返回结果。

鸿蒙Next中的异步操作通常与Promise对象相关联。Promise表示一个异步操作的最终完成(或失败)及其结果值。异步函数会自动返回一个Promise对象,该对象在函数执行完成后会被解析为函数的返回值。

例如:

function someAsyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("操作完成");
        }, 1000);
    });
}

async function myAsyncFunction() {
    let result = await someAsyncOperation();
    console.log(result); // 输出 "操作完成"
}

myAsyncFunction();

在这个例子中,someAsyncOperation返回一个Promise,该Promise在1秒后被解析为字符串"操作完成"。myAsyncFunction使用await等待该Promise解析,并在解析后输出结果。

鸿蒙Next中的异步编程模型与JavaScript标准中的异步编程模型基本一致,开发者可以使用async/await语法来简化异步代码的编写,使其更易于理解和维护。

在HarmonyOS鸿蒙Next中,async关键字用于声明异步函数,允许函数以非阻塞的方式执行耗时操作。通过结合await关键字,可以在异步函数中等待其他异步操作的完成。例如:

async function fetchData() {
    let response = await fetch('https://example.com/data');
    let data = await response.json();
    return data;
}

这种模式简化了异步代码的编写,使其更易读和维护。在鸿蒙Next中,async/await常用于网络请求、文件读写等I/O操作,提升应用性能和用户体验。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!