从不同的节点插件方法多次调用JS函数
Calling JS function multiple times from different node addon methods
我正在尝试使用 JS 回调初始化我的节点插件模块以进行日志记录。初始化方法旨在存储从其他方法调用的回调值。所以我使用napi_create_reference
添加对回调的引用。
但是当我尝试从我的第二个插件方法调用回调时MyAddonMethod
我收到napi_invalid_arg
错误。
我试图调查这个问题。调用napi_typeof
从MyAddonMethod
返回回调值也会返回napi_invalid_arg
。看起来回调值被垃圾收集了,尽管我有很强的参考。
我做错了什么?napi_create_reference
实际上是否阻止了插件调用之间的回调对象被垃圾回收?
// JS side:
const addon = require('./addon.node');
function logCallbackFunction(logLine)
{
console.log("Trace: " + logLine);
}
addon.Initialize(logCallbackFunction);
addon.MyAddonMethod();
// C++ side
// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Value = value; // store the value somewhere between calls
// MyAddonMethod method: // "env" doesn't change from call to call
napi_valuetype type;
napi_status stat = napi_typeof(env, g_Value, &type); // napi_invalid_arg
我终于发现我做错了什么。它不符合在呼叫之间存储g_Value
的条件。相反,应该存储napi_ref
并使用napi_get_reference_value
函数来提取相应的值。因此,C++端代码应如下所示:
// Initialize method:
napi_ref ref;
napi_create_reference(env, value, 1, &ref);
g_Ref = ref; // store the reference somewhere between calls
// MyAddonMethod method:
napi_value referenceValue;
napi_get_reference_value(env, g_Ref, &referenceValue);
napi_valuetype type;
napi_status stat = napi_typeof(env, referenceValue, &type); // napi_ok, napi_function
当然,您不应忘记在不再需要引用时使用napi_delete_reference
释放引用。
相关文章:
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- node.js Nan:在函数C++调用 JavaScript 回调
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 从 JS (V8) 中C++对象的引用调用函数
- 如何使用 cocos creator 在 Cocos2d-X/Cocos2d-JS 中调用 javascript 函数并
- 使用 Node.js 调用child_process与从 C 调用子进程并创建C++绑定以从 node.js 调用
- 从不同的节点插件方法多次调用JS函数
- 从节点addon多次调用JS函数
- 从嵌入式 v8 调用 webassembly 而不带 JS
- 从C 插件中调用QML中的JS函数
- 如何从 firefox-addon / js-ctypes 调用C++类实例
- JavaScript:从浏览器和 Node.js 中的 JavaScript 代码调用C++库
- 如何从node.js调用外部脚本/程序
- 节点.JS,C++模块:为什么当我尝试调用本地的长度方法时出现段错误<Array>?
- 如何从Node.js调用C++代码
- 在使用NAN的Node.js的C++模块中未调用SetAccessor函数
- 使用Node.js中包含char数组的结构调用C++dll
- 使用node.js从C++调用JavaScript
- 是否可以使用eclipseCDT代替vc++,以便使用SWIG调用node.js中的C++库
- 通过事件发射调用JS函数