使用NAN,如何从不是NAN_METHOD的C ++函数调用Javascript?

时间:2018-01-11 21:07:28

标签: javascript c++ node.js node.js-addon

我正在使用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()实际上被调用了吗?如果是这样,为什么我不看日志声明?

1 个答案:

答案 0 :(得分:0)

以下是使其有效的相关变化。

// 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);
}

这是一个微妙的变化,我不完全确定为什么这种方式有效,但另一方面没有。它会出现&#34; Nan :: Callback&#34;以某种方式保留&#34; v8 :: Local&#34; ISN&#39;吨