Вызов функции JS несколько раз из разных методов добавления узлов
Я пытаюсь инициализировать мой аддон модуля узла, используя обратный вызов JS для регистрации. Метод Initialize предназначен для хранения значения обратного вызова для вызова из других методов. Поэтому я добавляю ссылку на обратный вызов, используя napi_create_reference
,
Но когда я пытаюсь вызвать обратный вызов из моего второго метода addon 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
1 ответ
Я наконец нашел то, что я делал неправильно. Это не имеет права хранить 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
когда это больше не нужно.