日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
N-API之Promise篇

本文介紹N-API中的Promise功能的使用。Promise相關(guān)的API一共有四個(gè)。

 
 
 
 
  1. napi_create_promise // 創(chuàng)建一個(gè)Promise,類似new Promise
  2. napi_resolve_deferred // resolve一個(gè)Promise
  3. napi_reject_deferred // reject一個(gè)Promise
  4. napi_is_promise // 判斷變量是否是一個(gè)Promise

我們首先看一下napi_is_promise。測試代碼如下

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

接著看看N-API的實(shí)現(xiàn)。

 
 
 
 
  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. }

我們看到實(shí)現(xiàn)比較簡單,只是封裝了N-API的API。我們繼續(xù)看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的實(shí)現(xiàn)。

 
 
 
 
  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創(chuàng)建一個(gè)Promise。然后返回給js層,但是這個(gè)Promise是未決議的,這里我們通過給Libuv線程池實(shí)現(xiàn)一個(gè)異步的操作,然后在回調(diào)里resolve這個(gè)Promise。napi_create_promise API會(huì)生成兩個(gè)對象,一個(gè)Promise(返回給js),一個(gè)是deferred,我們修改Promise狀態(tài)的時(shí)候,是通過操作deferred變量,所以我們首先保存了該變量的值,然后在異步回調(diào)里修改它的狀態(tài)。我們看看線程池里執(zhí)行的代碼。

 
 
 
 
  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. }

我們在子線程里做一個(gè)計(jì)算,然后把結(jié)果保存到info里,接著在回調(diào)里做進(jìn)一步處理。

 
 
 
 
  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. }

在回調(diào)里,通過napi_resolve_deferred或napi_reject_deferred修改Promise(deferred)的狀態(tài),這時(shí)候,js層的回調(diào)就會(huì)被執(zhí)行。以上就是N-API中關(guān)于Promise的使用。


網(wǎng)站名稱:N-API之Promise篇
URL地址:http://m.5511xx.com/article/dhdgoeg.html