N-API之Promise篇

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

 
 
 
 
  1. napi_create_promise // 创建一个Promise,类似new Promise
  2. napi_resolve_deferred // resolve一个Promise
  3. napi_reject_deferred // reject一个Promise
  4. napi_is_promise // 判断变量是否是一个Promise

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

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

接着看看N-API的实现。

 
 
 
 
  1. static napi_value isPromise(napi_env env, napi_callback_info info) {
  2.   napi_value result;
  3.   size_t argc = 1;
  4.   napi_value argv[1];
  5.   bool is_promise;
  6.   napi_get_cb_info(env, info, &argc, argv, NULL, NULL);
  7.   napi_is_promise(env, argv[0], &is_promise);
  8.   napi_get_boolean(env, is_promise, &result);
  9.   return result;
  10. }
  11. napi_value Init(napi_env env, napi_value exports) {
  12.   napi_value func2;
  13.   napi_create_function(env,
  14.                       NULL,
  15.                       NAPI_AUTO_LENGTH,
  16.                       isPromise,
  17.                       NULL,
  18.                       &func2);
  19.   napi_set_named_property(env, exports, "isPromise", func2);
  20.   return exports;
  21. }

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

 
 
 
 
  1. const { getPromise, isPromise } = require('./build/Release/test.node');
  2. getPromise()
  3.     .then(
  4.         (result) => {
  5.             console.log('resolve', result)
  6.         }, 
  7.         (result) => {
  8.             console.log('reject',result)
  9.         }
  10.     );

接着看N-API的实现。

 
 
 
 
  1. struct info{
  2.   napi_async_work worker;
  3.   napi_deferred deferred;
  4.   int sum;
  5. };
  6. static napi_value getPromise(napi_env env, napi_callback_info info) {
  7.   napi_value promise;
  8.   napi_value resource_name;
  9.   struct info data = {nullptr, nullptr, 0};
  10.   struct info * ptr = &data;
  11.   napi_create_promise(env, &ptr->deferred, &promise);
  12.   napi_create_string_utf8(env,"test", NAPI_AUTO_LENGTH, &resource_name);
  13.   napi_create_async_work(env, nullptr, resource_name, work, done, (void *)ptr, &ptr->worker);
  14.   napi_queue_async_work(env, ptr->worker);
  15.   return promise;
  16. }
  17. napi_value Init(napi_env env, napi_value exports) {
  18.   napi_value func;
  19.   napi_create_function(env,
  20.                       NULL,
  21.                       NAPI_AUTO_LENGTH,
  22.                       getPromise,
  23.                       NULL,
  24.                       &func);
  25.   napi_set_named_property(env, exports, "getPromise", func);
  26.   return exports;
  27. }

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

 
 
 
 
  1. void work(napi_env env, void* data) {
  2.   struct info *arg = (struct info *)data;
  3.   int sum = 0;
  4.   for (int i = 0; i < 1000; i++) {
  5.     sum += i;
  6.   }
  7.   arg->sum = sum;
  8. }

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

 
 
 
 
  1. void done(napi_env env, napi_status status, void* data) { 
  2.   struct info *arg = (struct info *)data;
  3.   napi_value ret;
  4.   if (true) {
  5.     napi_create_int32(env, arg->sum, &ret);
  6.     napi_resolve_deferred(env, arg->deferred, ret);
  7.   } else {
  8.     napi_create_int32(env, 0, &ret);
  9.     napi_reject_deferred(env, arg->deferred, ret);
  10.   }
  11.   napi_delete_async_work(env, arg->worker);
  12.   arg->deferred = nullptr;
  13. }

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

网站名称:N-API之Promise篇
网站网址:http://www.shufengxianlan.com/qtweb/news41/445691.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联