我正在构建一个C ++库的节点模块包装器,以便将日志信息通过Nan传递给JavaScript。为此,NAN_Method可用于注册回调。回调处理程序必须通过vlAddLogListener()
在C ++库中将自身注册为回调。 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);
}
答案 0 :(得分:1)
使用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>
数组作为第二个参数并相应地增加第一个参数,将更多值传递给回调。