当使用uv_queue_work方法将任务抛到JS线程上面执行的时候,对JS线程的回调方法,一般情况下需要加上napi_handle_scope来管理回调方法创建的napi_value的生命周期。对于初学者来说,学习鸿蒙开发如何来入门比较好?
harmonyos
使用uv_queue_work方法,不会走Node-API框架,此时需要开发者自己合理使用napi_handle_scope来管理napi_value的生命周期。这是为什么?有没有相关的演示代码帮我分析一下呢?
您需要先 登录 才能评论/回答
全部评论(1)
异步任务
【规则】 当使用uv_queue_work方法将任务抛到JS线程上面执行的时候,对JS线程的回调方法,一般情况下需要加上napi_handle_scope来管理回调方法创建的napi_value的生命周期。
使用uv_queue_work方法,不会走Node-API框架,此时需要开发者自己合理使用napi_handle_scope来管理napi_value的生命周期。
说明
本规则旨在强调napi_value生命周期情况,若只想往JS线程抛任务,不推荐使用uv_queue_work方法。如有抛任务的需要,请使用napi_threadsafe_function系列接口。
正确示例:
void CallbackTest(CallbackContext* context)
{
uv_loop_s* loop = nullptr;
napi_get_uv_event_loop(context->env, &loop);
uv_work_t* work = new uv_work_t;
context->retData = 1;
work->data = (void*)context;
uv_queue_work(
loop, work,
// 请注意,uv_queue_work会创建一个线程并执行该回调函数,若开发者只想往JS线程抛任务,不推荐使用uv_queue_work,以避免冗余的线程创建
[](uv_work_t* work) {
// 执行一些业务逻辑
},
// 该回调会执行在loop所在的JS线程上
[](uv_work_t* work, int status) {
CallbackContext* context = (CallbackContext*)work->data;
napi_handle_scope scope = nullptr;
napi_open_handle_scope(context->env, &scope);
if (scope == nullptr) {
if (work != nullptr) {
delete work;
}
return;
}
napi_value callback = nullptr;
napi_get_reference_value(context->env, context->callbackRef, &callback);
napi_value retArg;
napi_create_int32(context->env, context->retData, &retArg);
napi_value ret;
napi_call_function(context->env, nullptr, callback, 1, &retArg, &ret);
napi_delete_reference(context->env, context->callbackRef);
napi_close_handle_scope(context->env, scope);
if (work != nullptr) {
delete work;
}
delete context;
}
);
}
2026-08-23 01:14:09