如何异步地使用node-addon-api的AsyncContext

8
AsyncContext的文档有一个示例(稍作修改,但仍然可以工作),该示例同步运行。
#include "napi.h"

void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info)
{
  Napi::Function callback = info[0].As<Napi::Function>();
  Napi::Object resource = info.Env().Global().As<Napi::Object>();;    
  Napi::AsyncContext context(info.Env(), "async_context_test", resource);

  callback.MakeCallback(Napi::Object::New(info.Env()),
      std::initializer_list<napi_value>{}, context);
}

我想知道如何异步使用它 - 这是我最新尝试的代码:

Napi::AsyncContext* _context;
Napi::FunctionReference* _callback;
Napi::Object* _resource;

void CallBack()
{
  _callback->MakeCallback(*_resource, std::initializer_list<napi_value>{}, *_context);
}

void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info)
{
  Napi::Function cb = info[0].As<Napi::Function>();
  _callback = new Napi::FunctionReference(Napi::Persistent(cb));
  _callback->SuppressDestruct();

  _resource = new Napi::ObjectReference(Napi::Persistent(env.Global()));
  _resource->SuppressDestruct();

  _context = new Napi::AsyncContext(info.Env(), "async_context_test", _resource->Value());

  // run CallBack() in different thread
}

该程序在CallBack()函数内部崩溃。

你最终解决了这个问题吗? - Ian Hunter
1
@IanHunter,我刚刚添加了一个答案,说明了我是如何解决这个问题的。 - Evgeniy Berezovsky
1个回答

2
原文:It turns out that node-addon-api's AsyncContext cannot be used on a different thread.
翻译:事实证明,node-addon-api的AsyncContext不能在不同的线程上使用。
原文:What you can do is use the n-api. Luckily, node-addon-api is only a thin wrapper around n-api, and both can be mixed and matched.
翻译:您可以使用n-api。幸运的是,node-addon-api只是n-api的一个轻量级封装,两者都可以混合和匹配使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接