如何使用N-API的Promise功能

本篇内容介绍了“如何使用N-API的Promise功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联10多年成都企业网站定制服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都企业网站定制及推广,对发电机回收等多个领域拥有丰富的网站营销经验的网站建设公司。

本文介绍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

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

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

接着看看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, 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的真正使用。测试代码如下

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

接着看N-API的实现。

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变量,所以我们首先保存了该变量的值,然后在异步回调里修改它的状态。我们看看线程池里执行的代码。

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里,接着在回调里做进一步处理。

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的使用。

“如何使用N-API的Promise功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


文章标题:如何使用N-API的Promise功能
链接地址:http://scyanting.com/article/gejhsj.html