前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >N-API之Promise篇

N-API之Promise篇

作者头像
theanarkh
发布2021-07-08 16:04:35
6910
发布2021-07-08 16:04:35
举报
文章被收录于专栏:原创分享

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

代码语言:javascript
复制
napi_create_promise // 创建一个Promise,类似new Promise
napi_resolve_deferred // resolve一个Promise
napi_reject_deferred // reject一个Promise
napi_is_promise // 判断变量是否是一个Promise

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

代码语言:javascript
复制
const { isPromise } = require('./build/Release/test.node');
console.log('is Promise', isPromise(1), isPromise(Promise.resolve()));

接着看看N-API的实现。

代码语言:javascript
复制
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, NULL, NULL);
  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;}

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

代码语言:javascript
复制
const { getPromise, isPromise } = require('./build/Release/test.node');getPromise()    .then(        (result) => {            console.log('resolve', result)        },         (result) => {            console.log('reject',result)        }    );

接着看N-API的实现。

代码语言:javascript
复制
struct info{
  napi_async_work worker;
  napi_deferred deferred;
  int sum;};
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;}

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

代码语言:javascript
复制
void work(napi_env env, void* data) {
  struct info *arg = (struct info *)data;
  int sum = 0;
  for (int i = 0; i < 1000; i++) {
    sum += i;
  }
  arg->sum = sum;}

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

代码语言:javascript
复制
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;}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档