1# 使用Node-API调用返回值为promise的ArkTS方法 2<!--Kit: NDK--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @xliu-huanwei; @shilei123; @huanghello--> 5<!--Designer: @shilei123--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @fang-jinxu--> 8 9## 场景介绍 10当ArkTS的返回值为Promise时,可以按以下方式在创建的ArkTS运行环境中调用异步接口。 11 12## 调用异步的ArkTS接口示例 13使用C++通过NAPI调用返回Promise的ArkTS方法。 14 15处理Promise对象:将Promise与C++回调绑定,处理异步结果。 16 17转换数据类型:在回调中将JavaScript结果转换为c++可用的数据。 18 19### 示例代码 20- 模块注册 21 ```c++ 22 #include "hilog/log.h" 23 #include "napi/native_api.h" 24 25 //解析Promise结果的回调 26 static napi_value ResolvedCallback(napi_env env, napi_callback_info info) 27 { 28 size_t argc = 1; 29 napi_value args[1] = { nullptr }; 30 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 31 32 int result = 0; 33 napi_get_value_int32(env, args[0], &result); 34 OH_LOG_INFO(LOG_APP, "Promise resolved with result:%{public}d", result); 35 return nullptr; 36 } 37 38 //拒绝Promise的回调 39 static napi_value RejectedCallback(napi_env env, napi_callback_info info) 40 { 41 size_t argc = 1; 42 napi_value args[1] = { nullptr }; 43 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 44 45 napi_value error = nullptr; 46 napi_coerce_to_string(env, args[0], &error); 47 char errorMsg[1024]; 48 size_t len; 49 napi_get_value_string_utf8(env, error, errorMsg, sizeof(errorMsg), &len); 50 OH_LOG_ERROR(LOG_APP, "Promise rejected with error:%{public}s", errorMsg); 51 return nullptr; 52 } 53 54 static napi_value CallArkTSAsync(napi_env env, napi_callback_info info) 55 { 56 size_t argc = 1; 57 napi_value argv[1] = { nullptr }; 58 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 59 // 初始化Promise对象 60 napi_value promise = nullptr; 61 napi_call_function(env, nullptr, argv[0], 0, nullptr, &promise); 62 63 // 初始化thenFunc对象 64 napi_value thenFunc = nullptr; 65 if (napi_get_named_property(env, promise, "then", &thenFunc) != napi_ok) { 66 return nullptr; 67 } 68 // 初始化onResolve对象 69 napi_value onResolve = nullptr; 70 // 初始化onReject对象 71 napi_value onReject = nullptr; 72 napi_create_function(env, "onResolve", NAPI_AUTO_LENGTH, ResolvedCallback, nullptr, &onResolve); 73 napi_create_function(env, "onReject", NAPI_AUTO_LENGTH, RejectedCallback, nullptr, &onReject); 74 // 创建参数数组 75 napi_value thenArgv[2] = {onResolve, onReject}; 76 napi_call_function(env, promise, thenFunc, 2, thenArgv, nullptr); 77 78 return nullptr; 79 } 80 81 // 注册模块接口 82 EXTERN_C_START 83 static napi_value Init(napi_env env, napi_value exports) 84 { 85 // 初始化属性描述数组 86 napi_property_descriptor desc[] = { 87 {"callArkTSAsync", nullptr, CallArkTSAsync, nullptr, nullptr, nullptr, napi_default, nullptr} 88 }; 89 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 90 return exports; 91 } 92 EXTERN_C_END 93 94 // 初始化模块 95 static napi_module nativeModule = { 96 .nm_version = 1, 97 .nm_flags = 0, 98 .nm_filename = nullptr, 99 .nm_register_func = Init, 100 .nm_modname = "entry", 101 .nm_priv = nullptr, 102 .reserved = { 0 }, 103 }; 104 105 extern "C" __attribute__((constructor)) void RegisterEntryModule() 106 { 107 napi_module_register(&nativeModule); 108 } 109 ``` 110 111- 接口声明 112 ```ts 113 // index.d.ts 114 export const callArkTSAsync: (func: Function) => object; 115 ``` 116 117- CMakeLists.txt文件需要按照以下配置: 118 119 ``` 120 // CMakeLists.txt 121 # the minimum version of CMake. 122 cmake_minimum_required(VERSION 3.4.1) 123 project(myapplication) 124 125 set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 126 127 if(DEFINED PACKAGE_FIND_FILE) 128 include(${PACKAGE_FIND_FILE}) 129 endif() 130 131 include_directories(${NATIVERENDER_ROOT_PATH} 132 ${NATIVERENDER_ROOT_PATH}/include) 133 134 add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 135 add_definitions( "-DLOG_TAG=\"testTag\"" ) 136 137 add_library(entry SHARED napi_init.cpp) 138 target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so) 139 ``` 140 141- ArkTS代码示例 142 ```ts 143 // index.ets 144 import testNapi from 'libentry.so'; 145 146 export function SetTimeout() : Promise<number> { 147 return new Promise((resolve) => { 148 setTimeout(() => { 149 resolve(42); 150 }, 1000); 151 }) 152 } 153 testNapi.callArkTSAsync(SetTimeout); 154 ``` 155