javascript - node.js 南 : call JavaScript callback in C++ function

标签 javascript c++ node.js node.js-addon node.js-nan

我正在为 C++ 库构建 Node 模块包装器以通过 Nan 传递日志信息到 JavaScript。为此,可以使用 NAN_Method 来注册回调。回调处理程序必须通过 vlAddLogListener() 在 C++ 库中将自己注册为回调。 LoggingCallbackHandler 在函数 dispatchEvent 中接收来自库的消息,这是一个 C++ 函数。如果我收到日志,我想调用 JavaScript 回调来传递数据。

dispatchEvent 函数未在 Nan 上下文中调用,因此我没有作用域/上下文,也无法访问 v8。如何调用 JavaScript 回调?

代码如下所示:

NAN_METHOD(registerLoggingCallback) 
{
    v8::Isolate* isolate = info.GetIsolate();
    v8::Local<v8::Function> fun = info[0].As<v8::Function>();
    lch = new LoggingCallbackHandler(isolate, fun);
}

LoggingCallbackHandler::LoggingCallbackHandler(v8::Isolate* isolate, v8::Local<v8::Function> fun) :
    _cb(isolate, fun)
{
    vlAddLogListener(&LoggingCallbackHandler::dispatchEvent, this);
}

void VL_CALLINGCONVENTION LoggingCallbackHandler::dispatchEvent(const char* eventData, void* clientData)
{
    // here I want to process the data and call the JavaScript callback
    v8::Local<v8::Function> f = v8::Local<v8::Function>::New(Nan::GetCurrentContext()->Global()->GetIsolate(), _cb);
    Nan::MakeCallback(Nan::GetCurrentContext()->Global(), f, argc, argv);
}

最佳答案

使用 Nan ,您应该使用 Nan::Callback 保存函数值在你的里面registerLoggingCallback功能:

Nan::Callback cb;
cb.Reset(info[0].As<v8::Function>());

存储这个Nan::Callback在你的类(class)里。修改你的dispatchEvent使用 uv_async_t 的函数安排对回调的调用在主线程中运行。

uv_async_t的使用可以使用 Nan::AsyncWorker 进行简化但你最好还是阅读 documentation以便更好地了解其工作原理。

当你真的想调用回调时,你可以这样做:

v8::Local<v8::Value> arg = Nan::Null();
cb.Call(1, &arg);

您可以通过传递 v8::Local<v8::Value> 的数组将更多值传递到回调中作为第二个参数并相应地增加第一个参数。

关于javascript - node.js 南 : call JavaScript callback in C++ function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488763/

相关文章:

node.js - 比较 Cloud Functions 中的两个 Firestore 时间戳

javascript - 正则表达式检测 JavaScript

javascript - 变量为 0 时的乘法赋值运算符

javascript - 我们每个网页的 Javascript 文件中的这些代码行是做什么的?

javascript - 通过相对文件路径解析 $ref

c++ - 以下模板函数的含义?

c++ - 为什么 {} 用于访问 std::hash 中的 operator()?

c++ - 运算符按位左移

node.js - 在 httpd 子域上运行 NodeJS 应用程序

javascript - Node.js 异步函数未被识别为有效的异步函数