Javascript 从不同的节点加载项方法多次调用JS函数
我正在尝试使用JS回调来初始化我的节点插件模块。Initialize方法用于存储从其他方法调用的回调值。因此,我使用Javascript 从不同的节点加载项方法多次调用JS函数,javascript,c++,node.js-addon,n-api,Javascript,C++,Node.js Addon,N Api,我正在尝试使用JS回调来初始化我的节点插件模块。Initialize方法用于存储从其他方法调用的回调值。因此,我使用napi\u create\u reference向回调添加引用 但是当我试图从第二个加载项方法调用回调时,我收到了napi\u invalid\u arg错误 我试图调查这个问题。对MyAddonMethod的回调值调用napi\u typeof也会返回napi\u invalid\u arg。看起来回调值是垃圾收集的,尽管我的引用很强 我做错了什么?napi\u create\
napi\u create\u reference
向回调添加引用
但是当我试图从第二个加载项方法调用回调时,我收到了napi\u invalid\u arg
错误
我试图调查这个问题。对MyAddonMethod
的回调值调用napi\u typeof
也会返回napi\u invalid\u arg
。看起来回调值是垃圾收集的,尽管我的引用很强
我做错了什么?napi\u create\u 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_值
。相反,应存储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
当然,在不需要的时候,你不应该忘记使用<代码> NAPIIODeleTeEngult> <代码>来发布引用。我没有尝试过,我也不直接使用N-API(我坚持C++和节点ADDON API)。但是您是否尝试过将引用计数传递为2而不是1?文档没有说,但是已经有了一个引用——JavaScript引用,所以如果napi_create_引用没有添加另一个引用,而只是使用您传递的1作为参数,可能会解释一些事情。可能会发布更多的代码——不清楚值是什么,也不清楚g_值是什么。如果有足够的代码来编译,它将更容易查看。当然,我尝试了2而不是1。结果是一样的。g_值的类型为napi_值。您是否尝试在节点加载项调用之间保存对js函数/对象的引用?您使用了什么节点加载项api方法?这可能会有所帮助:非常感谢@bmacnouton对您的支持!我仔细查看了Napi::FunctionReference的内部,最终发现了我做错了什么!除了在中引入的加载项方法外,它没有资格使用与加载项方法相同的
值。相反,应该使用napi_get_reference_值来提取对应的值。