导读 | 本文介绍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的使用。