HarmonyOS鸿蒙Next中ArkTS如何使用async/await异步编程?Promise.all并行执行如何实现?

HarmonyOS鸿蒙Next中ArkTS如何使用async/await异步编程?Promise.all并行执行如何实现? 我在 HarmonyOS 应用中需要处理数据库操作、网络请求等异步任务,想了解:

  1. async/await 语法如何在组件的 aboutToAppear() 生命周期中使用?

  2. 如何使用 try/catch 进行错误处理?

  3. Promise.all 如何实现多个异步操作并行执行?

  4. 如何实现请求超时控制?

  5. 在 UIAbility 的 onCreate 中如何正确初始化异步资源?

希望能获取异步编程的完整代码示例和常见陷阱说明。

3 回复

实现思路:

  1. 使用 async 关键字定义异步函数,使用 await 等待 Promise 完成:
async function fetchData(): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => resolve('数据加载完成'), 1000);
  });
}

async function main() {
  const result = await fetchData();
  console.info(result);
}
  1. 使用 try/catch 进行错误处理:
async function loadData(): Promise<void> {
  try {
    const data = await fetchData();
    console.info('成功:', data);
  } catch (err) {
    console.error('失败:', JSON.stringify(err));
  } finally {
    console.info('加载结束');
  }
}
  1. 使用 Promise.all 并行执行多个异步操作:
async function loadAllData(): Promise<void> {
  const [cases, favorites, stats] = await Promise.all([
    caseDao.getList(),
    favoriteDao.getFavorites(),
    statsService.getStats()
  ]);
  console.info(`加载完成: ${cases.length} 个案例`);
}
  1. 完整示例代码:
@Component
struct DataComponent {
  @State dataList: DataItem[] = [];
  @State isLoading: boolean = true;
  @State errorMessage: string = '';

  async aboutToAppear() {
    await this.loadData();
  }

  async loadData(): Promise<void> {
    this.isLoading = true;
    this.errorMessage = '';
    
    try {
      // 并行加载多个数据
      const [list, count] = await Promise.all([
        this.fetchList(),
        this.fetchCount()
      ]);
      this.dataList = list;
      console.info(`共 ${count} 条数据`);
    } catch (err) {
      this.errorMessage = '加载失败,请重试';
      console.error('Load error:', JSON.stringify(err));
    } finally {
      this.isLoading = false;
    }
  }

  async fetchList(): Promise<DataItem[]> {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve([
          { id: '1', name: 'Item 1' },
          { id: '2', name: 'Item 2' }
        ]);
      }, 1000);
    });
  }

  async fetchCount(): Promise<number> {
    return new Promise((resolve) => {
      setTimeout(() => resolve(100), 500);
    });
  }

  build() {
    Column() {
      if (this.isLoading) {
        LoadingProgress().width(40).height(40)
      } else if (this.errorMessage) {
        Column() {
          Text(this.errorMessage).fontSize(14)
          Button('重试').onClick(() => this.loadData())
        }
      } else {
        ForEach(this.dataList, (item: DataItem) => {
          Text(item.name)
        })
      }
    }
  }
}

interface DataItem {
  id: string;
  name: string;
}

更多关于HarmonyOS鸿蒙Next中ArkTS如何使用async/await异步编程?Promise.all并行执行如何实现?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ArkTS使用async/await进行异步编程。async函数返回Promise,await用于等待Promise结果。Promise.all并行执行通过传入Promise数组实现,所有Promise完成后返回结果数组。

在HarmonyOS Next的ArkTS中,async/await异步编程基于标准的ECMAScript规范,其使用方式与主流前端开发高度一致。

1. 在生命周期函数中使用async/await aboutToAppear()本身不支持async修饰。若需执行异步操作,应在函数内直接调用async函数,并通过.then()await(在另一个async上下文中)处理结果。例如:

aboutToAppear(): void {
  this.loadDataAsync(); // 调用异步函数
}

async loadDataAsync(): Promise<void> {
  const data = await this.fetchData(); // await在async函数内使用
  // 更新UI状态
}

2. 错误处理 使用try/catch捕获await表达式的异常:

async fetchData(): Promise<void> {
  try {
    const response = await someAsyncOperation();
  } catch (error) {
    console.error('操作失败:', error);
  }
}

3. Promise.all并行执行 Promise.all用于并行执行多个独立异步操作,当所有Promise均成功时返回结果数组,任一失败则立即拒绝:

async parallelTasks(): Promise<void> {
  try {
    const [result1, result2] = await Promise.all([
      asyncTask1(),
      asyncTask2()
    ]);
  } catch (error) {
    // 处理首个发生的错误
  }
}

4. 请求超时控制 可通过Promise.race实现超时机制:

async fetchWithTimeout(url: string, timeout: number): Promise<Response> {
  const fetchPromise = fetch(url);
  const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => reject(new Error('请求超时')), timeout);
  });
  return Promise.race([fetchPromise, timeoutPromise]);
}

5. UIAbility异步资源初始化onCreate中初始化异步资源时,需注意生命周期管理。避免在onCreate中直接使用await阻塞启动,建议将初始化封装为异步任务:

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  // 启动初始化任务,不阻塞UIAbility创建
  this.initializeAsync();
}

private async initializeAsync(): Promise<void> {
  await this.initDatabase();
  await this.preloadResources();
}

常见注意事项:

  • 在ArkUI组件中,异步操作完成后需通过状态变量(@State)触发UI更新
  • 避免在循环或高频回调中创建过多未处理的Promise
  • 使用Promise.allSettled替代Promise.all时,可获取所有操作的完成状态(无论成功/失败)
  • 异步函数调用链中的错误会向上传递,确保有适当的错误处理层级

以上实现均基于标准的Promise规范,在HarmonyOS Next的ArkTS运行时中可直接使用。

回到顶部