我正在为 C++ 库构建 Node 模块包装器以通过 Nan 传递日志信息到 JavaScript。为此,可以使用 NAN_Method 来注册回调。回调处理程序必须通过 vlAddLogListener()
在 C++ 库中将自己注册为回调。 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);
}
最佳答案
使用 Nan
,您应该使用 Nan::Callback
保存函数值在你的里面registerLoggingCallback
功能:
Nan::Callback cb;
cb.Reset(info[0].As<v8::Function>());
存储这个Nan::Callback
在你的类(class)里。修改你的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>
的数组将更多值传递到回调中作为第二个参数并相应地增加第一个参数。
关于javascript - node.js 南 : call JavaScript callback in C++ function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488763/