node.js Nan:在函数C++调用 JavaScript 回调

node.js Nan: call JavaScript callback in C++ function

本文关键字:C++ 调用 JavaScript 回调 函数 js Nan node      更新时间:2023-10-16

我正在为C++库构建一个节点模块包装器,以将日志记录信息通过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时,您应该在registerLoggingCallback函数中使用Nan::Callback保存函数值:

Nan::Callback cb;
cb.Reset(info[0].As<v8::Function>());

将此Nan::Callback存储在您的类中。 修改dispatchEvent函数以使用uv_async_t来计划在主线程中运行的对回调的调用。

可以使用Nan::AsyncWorker简化uv_async_t的使用,但最好阅读文档以更好地了解其工作原理。

当你真的想调用回调时,你可以做:

v8::Local<v8::Value> arg = Nan::Null();
cb.Call(1, &arg);

通过将v8::Local<v8::Value>数组作为第二个参数传递并相应地增加第一个参数,可以将更多值传递到回调中。