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一共有四個。
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的使用。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2777432/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 模擬Promise的功能Promise
- Promise的使用Promise
- Promise的基本使用Promise
- JS 中的 PromiseJSPromise
- iOS中的PromiseiOSPromise
- 150行實現Promise 90%的功能Promise
- 使用 RxJs Observable 來避免 Angular 應用中的 Promise 使用JSAngularPromise
- Spring中Enable*功能的使用Spring
- promise的理解和使用Promise
- JavaScript Promise 的使用技巧JavaScriptPromise
- js中的promise和thenJSPromise
- Promise(resolve,reject)的基本使用Promise
- ES6的Promise物件的使用Promise物件
- koa原始碼中的promise原始碼Promise
- ES6中的PromisePromise
- ES6中的Promise物件Promise物件
- JS中的Promise 物件記錄JSPromise物件
- Vue 中 Promise 的then方法非同步使用及async/await 非同步使用總結VuePromise非同步AI
- Promise的理解及react中的運用PromiseReact
- Promise使用Promise
- Promise和Promise的方法Promise
- 你是怎麼理解ES6中 Promise的?使用場景?Promise
- Promise使用時應注意的問題Promise
- ES6 Promise的使用和理解Promise
- Promise的使用及簡單實現Promise
- Promise 靜態 API 的使用方法PromiseAPI
- 從使用到原理,實現符合Promise A+規範的Promise方法Promise
- 由淺入深,從掌握Promise的基本使用到手寫PromisePromise
- es6中的promise解讀Promise
- 聊一聊Javascript中的Promise物件JavaScriptPromise物件
- 第147篇:微信小程式開發中Promise的使用(aysnc,await)微信小程式PromiseAI
- ES6 中 Promise物件使用學習Promise物件
- uniapp頁面中的按鈕使用分享功能APP
- Wondershare PDFelement Pro中的OCR功能使用教程
- 如何使用 SAP CDS view 中的 currency conversion 功能View
- 使用 Promise.withResolvers() 來簡化你將函式 Promise 化的實現~~Promise函式
- IDEA中git如何快捷的使用Cherry-Pick功能IdeaGit
- SAP Cloud for Customer框架是如何使用JavaScript Promise的Cloud框架JavaScriptPromise