当前位置: 首页 > 科技观察

N-API的Promise

时间:2023-03-14 19:44:32 科技观察

本文介绍了N-API中Promise函数的使用。有四个与Promise相关的API。napi_create_promise//创建一个Promise,类似于newPromisenapi_resolve_deferred//resolve一个Promisenapi_reject_deferred//拒绝一个Promisenapi_is_promise//判断变量是否是Promise,我们先看napi_is_promise。测试代码如下const{isPromise}=require('./build/Release/test.node');console.log('isPromise',isPromise(1),isPromise(Promise.resolve()));然后看N-API的实现。staticnapi_valueisPromise(napi_envenv,napi_callback_infoinfo){napi_valueresult;size_targc=1;napi_valueargv[1];boolis_promise;napi_get_cb_info(env,info,&argc,argv,NULL,NULL);napi_is_promise(env,argc,napi_promise[0],&,is_promise,&result;returnresult;}napi_valueInit(napi_envenv,napi_valueexports){napi_valuefunc2;napi_create_function(env,NULL,NAPI_AUTO_LENGTH,isPromise,NULL,&func2);napi_set_named_property(env,exports,"isPromise)";看到实现比较简单,只是封装了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的现实。nullptr,nullptr,0};structinfo*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);returnpromise;}napi_valueInit(napi_envenv,napi_valueexports){napi_valuefunc;napi_create_function(env,NULL,NAPI_AUTO_LENGTH,getPromise,NULL,&func);napi_set_named_property(env,exports,"getPromise",func);returnexports;}首先??通过napi_create_promise创建一个Promise。然后回到js层,但是Promise没有resolved。这里我们实现了一个Libuv线程池的异步操作,然后在回调中解析Promise。napi_create_promiseAPI会生成两个对象,一个Promise(返回给js),一个deferred。我们在修改Promise状态的时候,操作的是deferred变量,所以我们先保存变量的值,然后在异步回调状态修改。我们看一下线程池中执行的代码。voidwork(napi_envenv,void*data){structinfo*arg=(structinfo*)data;intsum=0;for(inti=0;i<1000;i++){sum+=i;}arg->sum=sum;}我们在子线程中做一次计算,然后将结果保存到info中,再在回调中做进一步的处理。voiddone(napi_envenv,napi_statusstatus,void*data){structinfo*arg=(structinfo*)data;napi_valueret;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的使用。