Вызов функции 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 когда это больше не нужно.

Другие вопросы по тегам