繁体   English   中英

node.js Nan:在C ++函数中调用JavaScript回调

[英]node.js Nan: call JavaScript callback in C++ function

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

函数dispatchEvent不在Nan-context中调用,因此我没有范围/上下文,也没有访问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 ,你应该在registerLoggingCallback函数中使用Nan::Callback保存函数值:

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

在你的班级中存储这个Nan::Callback 修改dispatchEvent函数以使用uv_async_t来调度对主线程中运行的回调的调用。

使用Nan::AsyncWorker可以简化uv_async_t的使用,但您可能最好阅读文档以更好地理解其工作原理。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM