成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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進程

2025-05-13 09:07:47

PromiseAPI靜態

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

2011-04-14 10:03:32

UI組件BlackBerry

2011-04-14 10:05:16

BlackBerry

2018-11-29 08:00:20

JavaScript異步Promise

2023-09-15 15:31:23

異步編程Promise

2011-02-25 10:36:12

Proftpd

2011-02-25 10:25:07

Proftpd

2025-05-08 08:35:00

異步編程JavaScriptAPI

2016-06-16 19:21:59

阿里云云服務器資源編排

2021-09-06 06:45:06

Webpack優化MindMaster

2011-03-02 14:07:24

Pureftpd

2014-09-01 10:36:35

個推推送

2009-11-06 16:48:03

WCF簡介

2014-06-09 14:18:24

2014-08-01 14:01:28

Android UI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品影院 | 国产一区二区精品在线 | 精一区二区 | 国产精品久久久久久久久污网站 | 国产精品自拍av | 国产激情自拍视频 | 精品国产乱码久久久久久丨区2区 | 一级毛片免费 | 日本久久福利 | 精品免费国产一区二区三区 | 日韩中文字幕在线不卡 | 中文字幕一区二区三区精彩视频 | 欧美中文字幕在线观看 | 国产精品国产亚洲精品看不卡15 | 成人影音| 日本一区二区三区在线观看 | 成人免费视频观看视频 | 日韩一区二区三区在线 | 91精品国产综合久久久久 | 久久久久99| 国产一区二区三区免费 | 精品无码久久久久久国产 | 综合久久av | 欧美一区二区在线看 | 日本午夜网站 | 精久久 | aaa在线 | 欧美一级久久精品 | 欧美女优在线观看 | av一级在线观看 | 中日韩毛片 | 午夜大片 | 国产一区二区视频在线观看 | 欧美亚洲综合久久 | 国产三级精品视频 | 91成人精品视频 | 欧美激情99 | 亚洲成人精品在线 | 日日干日日色 | 亚洲精品在线观看视频 | 精品亚洲一区二区三区 |