91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用N-API的Promise功能

發布時間:2021-06-15 15:18:47 來源:億速云 閱讀:225 作者:chen 欄目:web開發

本篇內容介紹了“如何使用N-API的Promise功能”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

本文介紹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功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文化| 墨脱县| 达尔| 三穗县| 隆昌县| 安塞县| 桃园县| 平利县| 顺平县| 蒙山县| 高阳县| 贵阳市| 滕州市| 馆陶县| 旺苍县| 安新县| 滨州市| 沙坪坝区| 新田县| 荃湾区| 左云县| 陇川县| 革吉县| 乐亭县| 密云县| 葫芦岛市| 响水县| 盐城市| 克什克腾旗| 将乐县| 乌拉特中旗| 江阴市| 天气| 香格里拉县| 耒阳市| 嵊泗县| 察哈| 平和县| 民勤县| 龙泉市| 尼勒克县|