harmony 鸿蒙使用Node-API调用返回值为promise的ArkTS方法
使用Node-API调用返回值为promise的ArkTS方法
场景介绍
当ArkTS的返回值为promise,开发者可以按照以下方式在自己创建的ArkTS运行环境中调用异步的ArkTS接口。
调用异步的ArkTS接口示例
从c++使用NAPI调用返回Promise的ArkTS方法。 处理Promise对象:将Promise与c++回调绑定,处理异步结果。 转换数据类型:在回调中将JavaScript结果转换为c++可用的数据。 线程安全处理:确保跨线程操作的安全性。
示例代码
模块注册
#include "hilog/log.h" #include "napi/native_api.h" #include <napi/common.h> #include <pthread.h> //解析Promise结果的回调 static napi_value ResolvedCallback(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); int result; napi_get_value_int32(env, args[0], &result); OH_LOG_INFO(LOG_APP, "Promise resolved with result:%{public}d", result); return nullptr; } //拒绝Promise的回调 static napi_value RejectedCallback(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); napi_value error; napi_coerce_to_string(env, args[0], &error); char errorMsg[1024]; size_t len; napi_get_value_string_utf8(env, error, errorMsg, sizeof(errorMsg), &len); OH_LOG_ERROR(LOG_APP, "Promise rejected with error:%{public}s", errorMsg); return nullptr; } static napi_value CallArkTSAsync(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value argv[1] = { nullptr }; napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); napi_value promise = nullptr; napi_call_function(env, nullptr, argv[0], 0, nullptr, &promise); napi_value thenFunc = nullptr; if (napi_get_named_property(env, promise, "then", &thenFunc) != napi_ok) { return nullptr; } napi_value onResolve = nullptr; napi_value onReject = nullptr; napi_create_function(env, "onResolve", NAPI_AUTO_LENGTH, ResolvedCallback, nullptr, &onResolve); napi_create_function(env, "onReject", NAPI_AUTO_LENGTH, RejectedCallback, nullptr, &onReject); napi_value argv1[2] = {onResolve, onReject}; napi_call_function(env, promise, thenFunc, 2, argv1, nullptr); return nullptr; } // 注册模块接口 EXTERN_C_START static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { {"callArkTSAsync", nullptr, CallArkTSAsync, nullptr, nullptr, nullptr, napi_default, nullptr} }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END static napi_module nativeModule = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = Init, .nm_modname = "entry", .nm_priv = nullptr, .reserved = { 0 }, }; extern "C" __attribute__((constructor)) void RegisterEntryModule() { napi_module_register(&nativeModule); }
接口声明
// index.d.ts export const callArkTSAsync: (func: Function) => object;
编译配置
CMakeLists.txt文件需要按照如下配置
// CMakeLists.txt # the minimum version of CMake. cmake_minimum_required(VERSION 3.4.1) project(myapplication) set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) if(DEFINED PACKAGE_FIND_FILE) include(${PACKAGE_FIND_FILE}) endif() include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include) add_library(entry SHARED hello.cpp) target_link_libraries(entry PUBLIC libace_napi.z.so)
需要在工程的build-profile.json5文件中进行以下配置
{ "buildOption" : { "arkOptions" : { "runtimeOnly" : { "sources": [ "./src/main/ets/pages/ObjectUtils.ets" ] } } } }
ArkTS代码示例
// index.ets import testNapi from 'libentry.so'; export function SetTimeout() : Promise<number> { return new Promise((resolve) => { setTimeout(() => { resolve(42); }, 1000); }) } testNapi.callArkTSAsync(SetTimeout);
你可能感兴趣的鸿蒙文章
0
赞
- 所属分类: 后端技术
- 本文标签:
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦