我正在为C库构建一个节点模块包装器,以便将日志信息通过 Nan传递给JavaScript.为此,NAN_Method可用于注册回调.回调处理程序必须通过vlAddLogListener()将自身注册为C库中的回调. LoggingCallbackH
函数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的使用,但最好还是阅读documentation,以便更好地理解其工作原理.
当你真的想要调用回调时,你可以这样做:
v8::Local<v8::Value> arg = Nan::Null(); cb.Call(1, &arg);
您可以通过传递一个v8 :: Local< v8 :: Value>数组将更多值传递给回调.作为第二个参数并相应地增加第一个参数.