Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用返回承诺的NAPI创建异步函数_Javascript_Node.js_Asynchronous_Promise_N Api - Fatal编程技术网

Javascript 如何使用返回承诺的NAPI创建异步函数

Javascript 如何使用返回承诺的NAPI创建异步函数,javascript,node.js,asynchronous,promise,n-api,Javascript,Node.js,Asynchronous,Promise,N Api,我正在尝试使用NAPI创建节点模块。我必须创建返回承诺的异步函数。我不希望TestAsyn函数会阻止NodeJS事件循环。异步是一个同步函数 napi_deferred do_something_synchronous(napi_env env,napi_deferred deferred){ printf("\n3) Function called"); //napi_deferred deferred; napi_value undefined; napi_status st

我正在尝试使用NAPI创建节点模块。我必须创建返回承诺的异步函数。我不希望TestAsyn函数会阻止NodeJS事件循环。异步是一个同步函数

napi_deferred do_something_synchronous(napi_env env,napi_deferred deferred){
  printf("\n3) Function called");
  //napi_deferred deferred;
  napi_value undefined;
  napi_status status;

  // Create a value with which to conclude the deferred.
  status = napi_get_undefined(env, &undefined);
  if (status != napi_ok) return NULL;
  sleep(5);
  // Resolve or reject the promise associated with the deferred depending on
  // whether the asynchronous action succeeded.
  if (false) {
    printf("\n5) Success\nXXXXXXX");
    status = napi_resolve_deferred(env, deferred, undefined);
  } else {
    printf("\nReject");
    status = napi_reject_deferred(env, deferred, undefined);
  }
  if (status != napi_ok) return NULL;

  // At this point the deferred has been freed, so we should assign NULL to it.
  deferred = NULL;
}

//Function will be called from the js 
napi_value testasynfunction(napi_env env, napi_callback_info info){
  printf("XXXXX Hello \n");
  napi_deferred deferred;
  napi_value promise;
  napi_status status;
  // Create the promise.
  status = napi_create_promise(env, &deferred, &promise);
  if (status != napi_ok) return NULL;
  printf("\n1) Calling function to do something");
  do_something_synchronous(env,deferred);
  //std::async(do_something_asynchronous,env,deferred);
  printf("\n2) Returning Promise");
  return promise;
}
napi_property_descriptor testasync = DECLARE_NAPI_METHOD("testasyn", testasynfunction);
  status = napi_define_properties(env, exports, 1, &testasync);
  assert(status == napi_ok);

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
问题:
1) 如何以异步方式运行do\u something\u synchronous,使nodejs事件循环不会被阻止并返回承诺?

以下代码段是此异步操作的关键组件。 napi\u create\u async\u work()函数分配一个工作对象,我们可以在其中指定worker handler函数,比如在我们的例子中ExecuteMyPromise1()(可以使用它部署长时间运行或流程繁重的任务)此函数将作为工作池线程的队列它将与node.js主事件循环线程并行异步执行

到目前为止,一切看起来都正常,当ExecuteMyPromise1函数计划直接从工作线程与JavaScript层交换结果时,问题就会出现任何JavaScript操作通常只能从本机插件的主线程调用。然后,对于这个结果交换,我们必须使用另一个将从主线程调用的本机函数。这就是为什么我们要使用CompleteMyPromise1函数处理程序(如果有任何最终清理活动也是通过该函数完成的)。当异步逻辑完成或取消时,将从主事件循环线程调用此本机函数

// The function called by javascript to get a promise returned.
napi_value MyPromise1(napi_env env, napi_callback_info info)
{

  // -- -- -- --
  // -- -- -- --

  // Create a promise object.
  status = napi_create_promise(env, &promDataEx->deferred, &promise);
  if (status != napi_ok)
  {
    napi_throw_error(env, NULL, "Unable to create promise.");
  }


  // -- -- -- --
  // -- -- -- --

  {
    // Create the async function.
    napi_value resource_name;
    napi_create_string_utf8(env, "MyPromise1", -1, &resource_name);
    napi_create_async_work(env, NULL, resource_name, 
        ExecuteMyPromise1, CompleteMyPromise1, 
        promDataEx, &promDataEx->work);
    napi_queue_async_work(env, promDataEx->work);
  }


  return promise;
}
//执行异步工作。
void ExecuteMyPromise1(napi_环境,void*数据)
{
prom_data_ex_t*promDataEx=(prom_data_ex_t*)数据;
//计算素数
promDataEx->PrimeCount=CPrimeCount(promDataEx->x,promDataEx->y);
//将状态设置为异步\u操作成功
promDataEx->异步\u操作\u状态=0;
//睡眠(3);
}
//处理异步工作的完成。
void CompleteMyPromise1(napi_环境、napi_状态、void*数据)
{
napi_值;
prom_data_ex_t*promDataEx=(prom_data_ex_t*)数据;
napi_create_int32(env、promDataEx->PrimeCount和rcValue);
//解决或拒绝与延期付款相关的承诺,具体取决于
//异步操作是否成功。
if(promDataEx->asynchronous\u action\u status==0)//成功
{
status=napi\u resolve\u deferred(env,promDataEx->deferred,rcValue);
}
其他的
{
napi_值未定义;
状态=napi\u get\u未定义(环境和未定义);
状态=napi_拒绝_延迟(环境,promDataEx->延迟,未定义);
}
如果(状态!=napi_正常)
{
napi_抛出_错误(env,NULL,“无法创建承诺结果”);
}
napi_删除_异步_工作(env,promDataEx->work);
免费(promDataEx);
}
下面是它的完整示例代码

JavaScrip调用是TestPromiseWithAsync()

您关于异步节点插件上StackOverflow的帖子和MyNodeC repo在让my C API与N-API异步工作方面发挥了不可言喻的作用。非常感谢你。如果可以的话,我会给你更多的分数!在这种情况下,我想你大概也会问这样一个问题:)