如何使用napi_create_async_work和napi_queue_async_work接口创建并执行异步任务(以Promise方式为例)?

阅读 687
1 个回答

以Promise方式为例,在C++代码中,首先获取应用传递的参数,创建Promise对象(napi_create_promise)并关联deferred对象。然后创建CallbackData结构体实例,存储相关数据(如deferred对象、参数等)。接着创建资源名称字符串,调用napi_create_async_work创建异步任务,传入环境、资源名称、执行回调函数(ExecuteCB)、完成回调函数(CompleteCB)、CallbackData实例等参数,获取异步任务对象并存储在CallbackData实例中。最后调用napi_queue_async_work将异步任务加入队列等待执行,返回创建的Promise对象。在执行回调函数(ExecuteCB)中处理业务逻辑,在完成回调函数(CompleteCB)中根据结果调用napi_resolve_deferrednapi_reject_deferred设置Promise状态,并删除异步任务和释放相关资源。示例代码如下:

struct CallbackData {
    napi_async_work asyncWork = nullptr;
    napi_deferred deferred = nullptr;
    napi_ref callback = nullptr;
    double args = 0;
    double result = 0;
};

static napi_value AsyncWork(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value args[1];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    napi_value promise = nullptr;
    napi_deferred deferred = nullptr;
    napi_create_promise(env, &deferred, &promise);
    auto callbackData = new CallbackData();
    callbackData->deferred = deferred;
    napi_get_value_double(env, args[0], &callbackData->args);
    napi_value resourceName = nullptr;
    napi_create_string_utf8(env, "AsyncCallback", NAPI_AUTO_LENGTH, &resourceName);
    napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB, callbackData, &callbackData->asyncWork);
    napi_queue_async_work(env, callbackData->asyncWork);
    return promise;
}

static void ExecuteCB(napi_env env, void *data) {
    CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
    callbackData->result = callbackData->args;
}

static void CompleteCB(napi_env env, napi_status status, void *data) {
    CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
    napi_value result = nullptr;
    napi_create_double(env, callbackData->result, &result);
    if (callbackData->result > 0) {
        napi_resolve_deferred(env, callbackData->deferred, result);
    } else {
        napi_reject_deferred(env, callbackData->deferred, result);
    }
    napi_delete_async_work(env, callbackData->asyncWork);
    delete callbackData;
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题