node.js Nan:在C ++函数中调用JavaScriptcallback
我正在为C ++库构build一个节点模块包装器来将日志信息通过Nan传递给JavaScript。 为此NAN_Method可用于注册callback。 callback处理程序必须通过vlAddLogListener()
将其自身注册为C ++库中的callback。 LoggingCallbackHandler
从库函数dispatchEvent
(一个C ++函数)接收消息。 如果我收到日志,我想调用JavaScriptcallback来传递数据。
函数dispatchEvent
不在Nan上下文中调用,因此我没有范围/上下文,也没有访问v8的权限。 如何调用JavaScriptcallback?
代码如下所示:
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
来安排调用你的callback函数在主线程中运行。
可以使用Nan::AsyncWorker
来简化uv_async_t
的使用,但是为了更好地理解它的工作原理,最好阅读文档 。
当你真的想要调用callback时,你可以这样做:
v8::Local<v8::Value> arg = Nan::Null(); cb.Call(1, &arg);
您可以通过传递一个v8::Local<v8::Value>
数组作为第二个参数,并相应地增加第一个参数,将更多的值传递给callback函数。