#鸿蒙通关秘籍#如何在鸿蒙下对N-API异步操作进行优化?

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
EVT流光瞬息

异步操作优化可以通过将耗时任务用异步方式实现。首先,用napi_create_promise接口创建Promise,然后执行耗时任务并将结果传递给Promise,接着使用napi_resolve_deferrednapi_reject_deffered方法来处理结果。以下是一个示例:

cpp struct AddonData { napi_async_work asyncWork = nullptr; napi_deferred deferred = nullptr; napi_ref callback = nullptr;

double args[2] = {0};
double result = 0;

};

static void addExecuteCB(napi_env env, void *data) { AddonData *addonData = (AddonData *)data; addonData->result = addonData->args[0] + addonData->args[1]; }

static void addPromiseCompleteCB(napi_env env, napi_status status, void *data) { AddonData *addonData = (AddonData *)data; napi_value result = nullptr; napi_create_double(env, addonData->result, &result); napi_resolve_deferred(env, addonData->deferred, result);

if (addonData->callback != nullptr) {
    napi_delete_reference(env, addonData->callback);
}

napi_delete_async_work(env, addonData->asyncWork);
delete addonData;
addonData = nullptr;

}

static napi_value addPromise(napi_env env, napi_callback_info info) { size_t argc = 2; napi_value args[2]; napi_value thisArg = nullptr; napi_get_cb_info(env, info, &argc, args, &thisArg, nullptr);

napi_value promise = nullptr;
napi_deferred deferred = nullptr;
napi_create_promise(env, &deferred, &promise);

auto addonData = new AddonData{
    .asyncWork = nullptr,
    .deferred = deferred,
};

napi_get_value_double(env, args[0], &addonData->args[0]);
napi_get_value_double(env, args[1], &addonData->args[1]);

napi_value resourceName = nullptr;
napi_create_string_utf8(env, "addAsyncCallback", NAPI_AUTO_LENGTH, &resourceName);
napi_create_async_work(env, nullptr, resourceName, addExecuteCB, addPromiseCompleteCB, (void *)addonData,
                       &addonData->asyncWork);

napi_queue_async_work(env, addonData->asyncWork);

return promise;

}

分享
微博
QQ
微信
回复
1天前
相关问题
如何异步方法进行插桩/替换
676浏览 • 1回复 待解决
如何JSON数据进行解析优化
752浏览 • 1回复 待解决
基于PhotoViewPicker图片进行操作
820浏览 • 1回复 待解决
基于CameraKit相机进行操作
671浏览 • 1回复 待解决