N-API之Promise篇

网友投稿 313 2023-05-15

本文介绍N-API中的Promise功能的使用。Promise相关的API一共有四个。

复制napi_create_promise // 创建一个Promise,类似new Promise  napi_resolve_deferred // resolve一个Promise  napi_reject_deferred // reject一个Promise  napi_is_promise // 判断变量是否是一个Promise  1.2.3.4.

我们首先看一下napi_is_promise。测试代码如下

复制const { isPromise } = require(./build/Release/test.node);  console.log(is Promise, isPromise(1), isPromise(Promise.resolve()));  1.2.

接着看看N-API的实现。

复制static napi_value isPromise(napi_env env, napi_callback_info info) {    napi_value result;    size_t argc = 1;    napi_value argv[1];    bool is_promise;    napi_get_cb_info(env, info, &argc, argv, NULLNULL);    napi_is_promise(env, argv[0], &is_promise);    napi_get_boolean(env, is_promise, &result);    return result;  napi_value Init(napi_env env, napi_value exports) {    napi_value func2;    napi_create_function(env,                        NULL                       NAPI_AUTO_LENGTH,                        isPromise,                        NULL                       &func2);    napi_set_named_property(env, exports, "isPromise", func2);    return exports;  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.

我们看到实现比较简单,只是封装了N-API的API。我们继续看Promise的真正使用。测试代码如下

复制const { getPromise, isPromise } = require(./build/Release/test.node);  getPromise()      .then         (result) => {              console.log(resolve, result)          },           (result) => {              console.log(reject,result)          }      );  1.2.3.4.5.6.7.8.9.10.

接着看N-API的实现。

复制struct info{    napi_async_work worker;    napi_deferred deferred;    intsum };  static napi_value getPromise(napi_env env, napi_callback_info info) {    napi_value promise;    napi_value resource_name;    struct info data = {nullptr, nullptr, 0};    struct info * ptr = &data;    napi_create_promise(env, &ptr->deferred, &promise);    napi_create_string_utf8(env,"test", NAPI_AUTO_LENGTH, &resource_name);    napi_create_async_work(env, nullptr, resource_name, work, done, (void *)ptr, &ptr->worker);    napi_queue_async_work(env, ptr->worker);    return promise;  napi_value Init(napi_env env, napi_value exports) {    napi_value func;    napi_create_function(env,                        NULL                       NAPI_AUTO_LENGTH,                        getPromise,                        NULL                       &func);    napi_set_named_property(env, exports, "getPromise", func);    return exports;  1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

首先通过napi_create_promise创建一个Promise。然后返回给js层,但是这个Promise是未决议的,这里我们通过给Libuv线程池实现一个异步的操作,然后在回调里resolve这个Promise。napi_create_promise API会生成两个对象,一个Promise(返回给js),一个是deferred,我们修改Promise状态的时候,是通过操作deferred变量,所以我们首先保存了该变量的值,然后在异步回调里修改它的状态。我们看看线程池里执行的代码。

复制void work(napi_env env, void* data) {    struct info *arg = (struct info *)data;    intsum = 0;    for (int i = 0; i < 1000; i++) {      sum += i;    }    arg->sum = sum 1.2.3.4.5.6.7.8.

我们在子线程里做一个计算,然后把结果保存到info里,接着在回调里做进一步处理。

复制void done(napi_env env, napi_status status, void* data) {     struct info *arg = (struct info *)data;    napi_value ret;    if (true) {      napi_create_int32(env, arg->sum, &ret);      napi_resolve_deferred(env, arg->deferred, ret);    } else {      napi_create_int32(env, 0, &ret);      napi_reject_deferred(env, arg->deferred, ret);    }    napi_delete_async_work(env, arg->worker);    arg->deferred = nullptr;  1.2.3.4.5.6.7.8.9.10.11.12.13.

在回调里,通过napi_resolve_deferred或napi_reject_deferred修改Promise(deferred)的状态,这时候,js层的回调就会被执行。以上就是N-API中关于Promise的使用。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:了解Android API中的SharedPreferences
下一篇:Mark Collier:OpenStack API兼容AWS
相关文章

 发表评论

暂时没有评论,来抢沙发吧~