#鸿蒙通关秘籍#调用异步ArkTS接口实现复杂业务逻辑的方法是什么?

HarmonyOS
7天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
API风中琴

可以借助napi_create_threadsafe_function实现对异步ArkTS接口的访问,实现异步任务的管理和回调。下面是如何访问系统定义的异步ArkTS方法的步骤:

static void CallJs(napi_env env, napi_value jsCb, void *context, void *data) {
    napi_value sysModule;
    napi_load_module(env, "@ohos.net.statistics", &sysModule);

    napi_value param;
    napi_create_string_utf8(env, "wlan0", NAPI_AUTO_LENGTH, &param);
    napi_value promise;
    napi_call_function(env, sysModule, jsCb, 1, &param, &promise);

    napi_value thenFunc = nullptr;
    napi_get_named_property(env, promise, "then", &thenFunc);

    napi_value resolvedCallback;
    napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH, ResolvedCallback, data, &resolvedCallback);

    napi_value rejectedCallback;
    napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH, RejectedCallback, data, &rejectedCallback);

    napi_value argv[2] = {resolvedCallback, rejectedCallback};
    napi_call_function(env, promise, thenFunc, 2, argv, nullptr);
}

static void ExecuteWork(napi_env env, void *data) {
    CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
    std::promise<double> promise;
    auto future = promise.get_future();
    napi_call_threadsafe_function(callbackData->tsfn, &promise, napi_tsfn_nonblocking);

    try {
        auto result = future.get();
        // 使用结果result进行后续业务处理
    } catch (const std::exception &e) {
        // 异常处理
    }
}

static napi_value CallAsyncFunc(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value jsCb = nullptr;
    CallbackData *callbackData = nullptr;
    napi_get_cb_info(env, info, &argc, &jsCb, nullptr, reinterpret_cast<void **>(&callbackData));

    napi_value sysModule;
    napi_load_module(env, "@ohos.net.statistics", &sysModule);

    napi_value getIfaceRxBytesFunc;
    napi_get_named_property(env, sysModule, "getIfaceRxBytes", &getIfaceRxBytesFunc);

    napi_value resourceName;
    napi_create_string_utf8(env, "CallAsyncFunc", NAPI_AUTO_LENGTH, &resourceName);
    napi_create_threadsafe_function(env, getIfaceRxBytesFunc, nullptr, resourceName, 0, 1, callbackData, nullptr, callbackData, CallJs,
        &callbackData->tsfn);

    napi_create_async_work(env, nullptr, resourceName, ExecuteWork, WorkComplete, callbackData, &callbackData->work);
    napi_queue_async_work(env, callbackData->work);
    return nullptr;
}
分享
微博
QQ
微信
回复
7天前
相关问题
harmony os demuxer 接口实现开源了嘛 ?
8836浏览 • 1回复 待解决
arkts能否直接调用nodejs接口
1845浏览 • 1回复 待解决
利用native接口实现一个圆角矩形
1641浏览 • 1回复 待解决