讨论广场 问答详情
当使用uv_queue_work方法将任务抛到JS线程上面执行的时候,对JS线程的回调方法,一般情况下需要加上napi_handle_scope来管理回调方法创建的napi_value的生命周期。对于初学者来说,学习鸿蒙开发如何来入门比较好?
aurora6688 2026-08-23 01:13:37
70 评论 分享
harmonyos

使用uv_queue_work方法,不会走Node-API框架,此时需要开发者自己合理使用napi_handle_scope来管理napi_value的生命周期。这是为什么?有没有相关的演示代码帮我分析一下呢?

70 评论 分享
写回答
全部评论(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