N-API之Promise篇

开发 前端
本文介绍N-API中的Promise功能的使用。Promise相关的API一共有四个。在回调里,通过napi_resolve_deferred或napi_reject_deferred修改Promise(deferred)的状态,这时候,js层的回调就会被执行。以上就是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.  
  7.   napi_get_cb_info(env, info, &argc, argv, NULLNULL); 
  8.   napi_is_promise(env, argv[0], &is_promise); 
  9.   napi_get_boolean(env, is_promise, &result); 
  10.  
  11.   return result; 
  12.  
  13. napi_value Init(napi_env env, napi_value exports) { 
  14.   napi_value func2; 
  15.   napi_create_function(env, 
  16.                       NULL
  17.                       NAPI_AUTO_LENGTH, 
  18.                       isPromise, 
  19.                       NULL
  20.                       &func2); 
  21.   napi_set_named_property(env, exports, "isPromise", func2); 
  22.  
  23.   return exports; 

我们看到实现比较简单,只是封装了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.  
  7. static napi_value getPromise(napi_env env, napi_callback_info info) { 
  8.   napi_value promise; 
  9.   napi_value resource_name; 
  10.   struct info data = {nullptr, nullptr, 0}; 
  11.   struct info * ptr = &data; 
  12.   napi_create_promise(env, &ptr->deferred, &promise); 
  13.   napi_create_string_utf8(env,"test", NAPI_AUTO_LENGTH, &resource_name); 
  14.   napi_create_async_work(env, nullptr, resource_name, work, done, (void *)ptr, &ptr->worker); 
  15.   napi_queue_async_work(env, ptr->worker); 
  16.  
  17.   return promise; 
  18.  
  19. napi_value Init(napi_env env, napi_value exports) { 
  20.   napi_value func; 
  21.   napi_create_function(env, 
  22.                       NULL
  23.                       NAPI_AUTO_LENGTH, 
  24.                       getPromise, 
  25.                       NULL
  26.                       &func); 
  27.   napi_set_named_property(env, exports, "getPromise", func); 
  28.  
  29.   return exports; 

首先通过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

我们在子线程里做一个计算,然后把结果保存到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; 

 

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

 

责任编辑:武晓燕 来源: 编程杂技
相关推荐

2021-06-05 06:49:54

LibuvN-API进程

2011-07-12 22:18:03

台式机用户体验

2020-11-27 08:02:41

Promise

2020-10-23 10:10:59

Promise前端代码

2020-09-21 05:54:45

Promise APIJSCSS

2023-09-15 15:31:23

异步编程Promise

2011-04-14 10:05:16

BlackBerry

2011-04-14 10:03:32

UI组件BlackBerry

2018-11-29 08:00:20

JavaScript异步Promise

2011-02-25 10:25:07

Proftpd

2020-07-29 17:35:08

Promise源码前端

2020-12-15 08:01:24

Promise参数ES6

2011-02-25 10:36:12

Proftpd

2016-06-16 19:21:59

阿里云云服务器资源编排

2013-09-02 16:13:56

API应用资源

2021-12-08 09:11:41

前端

2014-08-01 14:01:28

Android UI

2021-09-06 06:45:06

WebpackMindMasterEntry

2014-09-01 10:36:35

个推推送

2009-11-06 16:48:03

WCF简介
点赞
收藏

51CTO技术栈公众号