使用 NAN,如何从不是 NAN_METHOD 的 C++ 函数中调用 Javascript?
Using NAN, how do I call Javascript from a C++ function that's not a NAN_METHOD?
我正在使用 NAN 制作 C++ 本机插件。我的 AddOn.cc 文件包含一个从 Javascript 调用的 NAN 方法 Update()。 Update() 然后调用 C++ 依赖库,后者又调用回 Addon.cc StatusHandler() 中的 NON-NAN 函数。这又会调用 Javascript 回调。
在调用 Update() 之前,Javascript 代码调用 Startup() 并传递一个函数以用作 StatusHandler() 中的回调。
这是我的 ADDON.CC 文件中的相关代码:
// Javascript status delegate
v8::Local<v8::Function> jsStatusDelegate;
NAN_METHOD(Startup) {
// Set Javascript status delegate
jsStatusDelegate = v8::Local<v8::Function>::Cast(info[0]);
}
// Update method called from Javascript
NAN_METHOD(Update) {
// Call method that will call back to StatusHandler
myLibrary->Update();
}
// Status delegate called back from dependency library
void StatusHandler(LibStatus &status) {
// Create callback parameters
const int argc = 1;
v8::Local<v8::Value> args[argc];
args[0] = Nan::New("All Good.").ToLocalChecked();
TRACE("=========== Calling Javascript Delegate");
Nan::Callback callbackFunc(jsStatusDelegate);
v8::Local<v8::Value> jsReturnValue = callbackFunc.Call(argc, args);
}
这是我的测试脚本中的相关代码:
var addon = require('bindings')('addon');
addon.Startup(StatusDelegate);
addon.Update();
function StatusDelegate(status) {
console.log("******** Javascript StatusDelegate ********");
console.log(status);
}
一切都编译并运行,双方都没有错误。我从 C++ 语句中看到了 TRACE,但没有看到 StatusDelegate() 的输出。
我做错了什么? StatusDelegate() 真的被调用了吗?如果是这样,为什么我看不到日志语句?
以下是使其生效的相关更改。
// Javascript status delegate
Nan::Callback jsStatusDelegate;
NAN_METHOD(Startup) {
// Set Javascript status delegate
jsStatusDelegate.Reset(info[0].As<v8::Function>());
}
// Status delegate called back from dependency library
void StatusHandler(LibStatus &status) {
// ...same code...
TRACE("=========== Calling Javascript Delegate");
// New code
v8::Local<v8::Value> jsReturnValue = jsStatusDelegate.Call(argc, args);
}
这是一个微妙的变化,我不完全确定为什么这种方式行得通,而另一种则行不通。 "Nan::Callback" 似乎以某种方式保留,而 "v8::Local" 则没有。
我正在使用 NAN 制作 C++ 本机插件。我的 AddOn.cc 文件包含一个从 Javascript 调用的 NAN 方法 Update()。 Update() 然后调用 C++ 依赖库,后者又调用回 Addon.cc StatusHandler() 中的 NON-NAN 函数。这又会调用 Javascript 回调。
在调用 Update() 之前,Javascript 代码调用 Startup() 并传递一个函数以用作 StatusHandler() 中的回调。
这是我的 ADDON.CC 文件中的相关代码:
// Javascript status delegate
v8::Local<v8::Function> jsStatusDelegate;
NAN_METHOD(Startup) {
// Set Javascript status delegate
jsStatusDelegate = v8::Local<v8::Function>::Cast(info[0]);
}
// Update method called from Javascript
NAN_METHOD(Update) {
// Call method that will call back to StatusHandler
myLibrary->Update();
}
// Status delegate called back from dependency library
void StatusHandler(LibStatus &status) {
// Create callback parameters
const int argc = 1;
v8::Local<v8::Value> args[argc];
args[0] = Nan::New("All Good.").ToLocalChecked();
TRACE("=========== Calling Javascript Delegate");
Nan::Callback callbackFunc(jsStatusDelegate);
v8::Local<v8::Value> jsReturnValue = callbackFunc.Call(argc, args);
}
这是我的测试脚本中的相关代码:
var addon = require('bindings')('addon');
addon.Startup(StatusDelegate);
addon.Update();
function StatusDelegate(status) {
console.log("******** Javascript StatusDelegate ********");
console.log(status);
}
一切都编译并运行,双方都没有错误。我从 C++ 语句中看到了 TRACE,但没有看到 StatusDelegate() 的输出。
我做错了什么? StatusDelegate() 真的被调用了吗?如果是这样,为什么我看不到日志语句?
以下是使其生效的相关更改。
// Javascript status delegate
Nan::Callback jsStatusDelegate;
NAN_METHOD(Startup) {
// Set Javascript status delegate
jsStatusDelegate.Reset(info[0].As<v8::Function>());
}
// Status delegate called back from dependency library
void StatusHandler(LibStatus &status) {
// ...same code...
TRACE("=========== Calling Javascript Delegate");
// New code
v8::Local<v8::Value> jsReturnValue = jsStatusDelegate.Call(argc, args);
}
这是一个微妙的变化,我不完全确定为什么这种方式行得通,而另一种则行不通。 "Nan::Callback" 似乎以某种方式保留,而 "v8::Local" 则没有。