簡體   English   中英

從不同的節點插件方法多次調用 JS 函數

[英]Calling JS function multiple times from different node addon methods

我正在嘗試使用 JS 回調來初始化我的節點插件模塊以進行日志記錄。 Initialize 方法旨在存儲從其他方法調用的回調值。 所以我使用napi_create_reference添加對回調的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_Valueg_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釋放引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM