2017-08-03 120 views
2

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

回答

0

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

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

商店这Nan::Callback您的类中。修改您的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>数组作为第二个参数,并相应增加了第一个参数传递更多价值步入回调。