相关问题
#鸿蒙通关秘籍#如何在鸿蒙开发中使用Promise模式实现异步操作?
115浏览 • 2回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用GridContainer进行灵活布局?
74浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙应用中使用异步Promise与前端页面进行通信?
31浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用WebRTC进行视频会议?
69浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中使用TaskPool处理同步任务?
82浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙长时任务中使用WantAgent?
24浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在异步线程中使用Node-API向ArkTS线程投递任务?
3浏览 • 0回复 待解决
#鸿蒙通关秘籍#如何在libevent中使用异步DNS解析功能
69浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用Promise进行文件写入操作?
80浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙中使用Worker实现线程间异步通信?
74浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙应用中使用openLink接口进行跳转?
65浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙应用中使用hilog进行日志输出?
82浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用gesture方法绑定手势?
85浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用RelativeContainer实现相对布局?
111浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在鸿蒙应用中通过合理使用异步任务提升响应速度?
58浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用CSS选择器?
69浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用GridRowSizeOption的尺寸属性?
91浏览 • 2回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用NavPathStack管理导航页面
95浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙开发中使用Grid实现网格布局?
78浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS NEXT中使用像素单位进行布局?
135浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中使用effectKit进行图像模糊处理?
107浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中使用scanBarcode模块进行扫码?
163浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何通过Callback方式获取扫码结果?
118浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用隐式Want启动组件?
76浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在鸿蒙系统中使用显式Want启动组件?
58浏览 • 1回复 待解决
在鸿蒙系统中,通过Node-API进行异步任务开发时,除了使用Promise,还可以使用callback方式。在这种方式下,可以通过传递一个回调函数以接收任务完成后的结果。下面是一个关于如何使用callback方式进行异步操作的代码示例:
cpp struct CallbackData { napi_async_work asyncWork = nullptr; napi_ref callbackRef = nullptr; double args[2] = {0}; double result = 0; };
napi_value AsyncWork(napi_env env, napi_callback_info info) { size_t argc = 3; napi_value args[3]; napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); auto asyncContext = new CallbackData(); napi_get_value_double(env, args[0], &asyncContext->args[0]); napi_get_value_double(env, args[1], &asyncContext->args[1]); napi_create_reference(env, args[2], 1, &asyncContext->callbackRef); napi_value resourceName = nullptr; napi_create_string_utf8(env, "asyncWorkCallback", NAPI_AUTO_LENGTH, &resourceName); napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB, asyncContext, &asyncContext->asyncWork); napi_queue_async_work(env, asyncContext->asyncWork); return nullptr; }
static void ExecuteCB(napi_env env, void *data) { CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); callbackData->result = callbackData->args[0] + callbackData->args[1]; }
static void CompleteCB(napi_env env, napi_status status, void *data) { CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); napi_value callbackArg[1] = {nullptr}; napi_create_double(env, callbackData->result, &callbackArg[0]); napi_value callback = nullptr; napi_get_reference_value(env, callbackData->callbackRef, &callback); napi_value result; napi_value undefined; napi_get_undefined(env, &undefined); napi_call_function(env, undefined, callback, 1, callbackArg, &result); napi_delete_reference(env, callbackData->callbackRef); napi_delete_async_work(env, callbackData->asyncWork); delete callbackData; }
static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor desc[] = { { "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr } }; napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; }
let num1: number = 123; let num2: number = 456; nativeModule.asyncWork(num1, num2, (result) => { hilog.info(0x0000, 'XXX', 'result is %{public}d', result); });