S.B*_*.B. 5 javascript c++ node.js node.js-nan node.js-addon
我正在为 C++ 库构建一个节点模块包装器,以通过Nan将日志信息传递给 JavaScript。为此,可以使用 NAN_Method 来注册回调。回调处理程序必须通过vlAddLogListener(). 的LoggingCallbackHandler在函数从库接收到一个消息dispatchEvent,一个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);
}
Run Code Online (Sandbox Code Playgroud)
使用 时,您应该使用函数内部的Nana 来保存函数值:Nan::CallbackregisterLoggingCallback
Nan::Callback cb;
cb.Reset(info[0].As<v8::Function>());
Run Code Online (Sandbox Code Playgroud)
将其存储Nan::Callback在您的班级中。修改您的dispatchEvent函数以使用 a 来uv_async_t安排对要在主线程中运行的回调的调用。
可以使用uv_async_ta 来简化 的使用,Nan::AsyncWorker但您最好阅读文档以更好地了解其工作原理。
当你真正想调用回调时,你可以这样做:
v8::Local<v8::Value> arg = Nan::Null();
cb.Call(1, &arg);
Run Code Online (Sandbox Code Playgroud)
您可以通过传递一个数组v8::Local<v8::Value>作为第二个参数并相应地增加第一个参数来将更多值传递到回调中。