#鸿蒙通关秘籍#如何在鸿蒙中使用Node-API扩展接口运行异步线程的事件循环?

HarmonyOS
6h前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
IoT风中琴

在鸿蒙中调用异步的ArkTS接口时,通过Node-API的扩展接口napi_run_event_loop启动事件循环,napi_stop_event_loop停止事件循环。使用napi_event_mode_nowait模式运行事件循环,系统从事件队列中取出任务处理后立即停止,适用于不想阻塞当前线程的场景。使用napi_event_mode_default则会阻塞线程,不断尝试处理任务,需手动停止以解除阻塞。

以下是基于该架构的代码示例:

cpp #include "napi/native_api.h" #include <napi/common.h> #include <pthread.h>

static napi_value ResolvedCallback(napi_env env, napi_callback_info info) { napi_stop_event_loop(env); return nullptr; }

static napi_value RejectedCallback(napi_env env, napi_callback_info info) { napi_stop_event_loop(env); return nullptr; }

static void *RunEventLoopFunc(void *arg) { napi_env env; napi_status ret = napi_create_ark_runtime(&env); if (ret != napi_ok) { return nullptr; }

napi_value objectUtils;
ret = napi_load_module_with_info(env, "ets/pages/ObjectUtils", "com.example.myapplication/entry", &objectUtils);
if (ret != napi_ok) {
    return nullptr;
}

napi_value setTimeout = nullptr;
napi_value promise = nullptr;

napi_get_named_property(env, objectUtils, "SetTimeout", &setTimeout);
napi_call_function(env, objectUtils, setTimeout, 0, nullptr, &promise);

napi_value theFunc = nullptr;
if (napi_get_named_property(env, promise, "then", &theFunc) != napi_ok) {
    return nullptr;
}

napi_value resolvedCallback = nullptr;
napi_value rejectedCallback = nullptr;
napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH, ResolvedCallback, nullptr, &resolvedCallback);
napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH, RejectedCallback, nullptr, &rejectedCallback);
napi_value argv[2] = {resolvedCallback, rejectedCallback};
napi_call_function(env, promise, theFunc, 2, argv, nullptr);

auto flag = reinterpret_cast<bool *>(arg);
if (*flag == true) {
    napi_run_event_loop(env, napi_event_mode_default);
} else {
    napi_run_event_loop(env, napi_event_mode_nowait);
}
return nullptr;

}

分享
微博
QQ
微信
回复
5h前
相关问题