Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从不同的节点加载项方法多次调用JS函数_Javascript_C++_Node.js Addon_N Api - Fatal编程技术网

Javascript 从不同的节点加载项方法多次调用JS函数

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\

我正在尝试使用JS回调来初始化我的节点插件模块。Initialize方法用于存储从其他方法调用的回调值。因此,我使用
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_值来提取对应的值。