[经验分享] aki::Promise 介绍

深开鸿_苟晶晶 显示全部楼层 发表于 2025-1-22 17:38:40

在现代跨语言开发中,异步编程是一个不可或缺的特性,尤其是在需要处理耗时操作(如网络请求、文件操作等)时。Aki 是一个专为 OpenHarmony 平台设计的开发框架,用于简化 JavaScript 和 C/C++ 之间的互操作。aki::Promise 是 Aki 框架中的一个重要组件,它为 C++ 提供了类似 JavaScript 中 Promise 的异步编程能力,使得开发者可以在 C++ 中以更优雅的方式处理异步任务。

功能特性

aki::Promise 提供了以下核心功能,用于支持异步编程:

  1. 异步任务封装

    • aki::Promise 允许开发者封装异步操作,并通过 ResolveReject 方法处理成功或失败的结果。这类似于 JavaScript 中的 Promise,使得异步任务的管理更加直观。
  2. 线程安全

    • aki::Promise 设计为线程安全,可以在多线程环境中安全地使用。这使得开发者可以在后台线程中执行异步任务,并将结果传递回主线程,而无需担心线程安全问题。
  3. 异步任务的链式调用

    • 与 JavaScript 的 Promise 类似,aki::Promise 支持链式调用。开发者可以通过 .then().catch() 方法处理异步任务的结果或错误,从而实现复杂的异步流程控制。

应用场景

aki::Promise 在以下场景中尤其有用:

  1. 异步任务处理

    • 结合 aki::TaskRunner,在需要执行耗时操作时,aki::Promise 可以将任务发布到后台线程,并在任务完成后通过回调函数返回结果。这避免了主线程的阻塞,提高了应用的响应性。
  2. 跨语言数据交互

    • aki::Promise 可以在 C++ 和 JavaScript 之间传递异步任务的结果。这使得开发者可以在 C++ 中处理复杂的逻辑,同时利用 JavaScript 的灵活性。
  3. UI 更新

    • 在需要从后台线程更新 UI 时,aki::Promise 可以确保更新操作在主线程中安全执行。

使用示例

以下是一个使用 aki::Promise 的示例,展示了如何在 C++ 中创建和使用异步任务:

.d.ts文件声明

export class JSBind {
  static initTaskRunner: (param: string) => void;
}
export const ReturnPromiseResolveLater: () => Promise<object>;

.ets文件调用

// 初始化任务运行器
testNapi.JSBind.initTaskRunner("main");

// 调用 C++ 中定义的异步方法
testNapi.ReturnPromiseResolveLater().then((value) => {
    console.log('[AKI] ReturnPromiseResolveLater then: ' + value);
});

.cpp文件

#include <aki/jsbind.h>
#include "napi/native_api.h"

// 定义异步方法
aki::Promise ReturnPromiseResolveLater() {
    aki::Promise promise;
    std::thread t([promise]() {
        aki::TaskRunner::PostTask("main", [promise]() {
            promise.Resolve("Task completed!");
        });
    });
    t.detach();
    return promise;
}

// Step 1 注册 AKI 插件
JSBIND_ADDON(hello) // 注册 AKI 插件名: 即为编译*.so名称,规则与NAPI一致
// Step 2 注册 FFI 特性
JSBIND_GLOBAL() {
    // Step 3 注册ReturnPromiseResolveLater方法
    JSBIND_FUNCTION(ReturnPromiseResolveLater);
}

在这个示例中,ReturnPromiseResolveLater 方法创建了一个 Promise 对象,并在一个后台线程中发布了一个任务。任务完成后,Promise 被解析为字符串 "Task completed!"。JavaScript 代码通过 then 方法注册了一个回调函数,用于处理异步任务的结果。

打印结果如下:

aea658eafe5c8b1dbec1098e337b7223.png

总结

aki::Promise 是 Aki 框架中用于异步编程的核心工具,它为 C++ 开发者提供了类似 JavaScript 中 Promise 的功能。通过封装异步任务、支持链式调用和线程安全,aki::Promise 使得异步编程变得更加简单和直观。在 OpenHarmony 开发中,aki::Promise 是实现高效跨语言异步交互的理想选择。

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部