共计 2780 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | 本文介绍 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 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 的使用。
正文完
星哥玩云-微信公众号
