从不同的节点插件方法多次调用 JS 函数
Calling JS function multiple times from different node addon methods
我正在尝试使用 JS 回调来初始化我的节点插件模块以进行日志记录。 Initialize 方法旨在存储从其他方法调用的回调值。所以我使用 napi_create_reference
.
添加对回调的引用
但是当我尝试从我的第二个插件方法 MyAddonMethod
调用回调时,我收到 napi_invalid_arg
错误。
我已尝试调查此问题。对 napi_typeof
的调用也是来自 MyAddonMethod
returns 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
释放引用。
我正在尝试使用 JS 回调来初始化我的节点插件模块以进行日志记录。 Initialize 方法旨在存储从其他方法调用的回调值。所以我使用 napi_create_reference
.
但是当我尝试从我的第二个插件方法 MyAddonMethod
调用回调时,我收到 napi_invalid_arg
错误。
我已尝试调查此问题。对 napi_typeof
的调用也是来自 MyAddonMethod
returns 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
释放引用。