Вызов функции JS несколько раз из разных методов добавления узлов - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь инициализировать свой модуль расширения узла, используя обратный вызов JS для ведения журнала.Метод Initialize предназначен для хранения значения обратного вызова для вызова из других методов.Поэтому я добавляю ссылку на обратный вызов, используя napi_create_reference.

Но когда я пытаюсь вызвать обратный вызов из моего второго метода расширения MyAddonMethod, я получаю napi_invalid_arg ошибку.

IЯ пытался исследовать проблему.Вызов napi_typeof для значения обратного вызова из MyAddonMethod также возвращает napi_invalid_arg.Похоже, что значение обратного вызова было собрано мусором, несмотря на мои сильные ссылки.

Что я делаю не так?napi_create_reference не позволяет ли объекту обратного вызова собирать мусор между вызовами аддона?

1 Ответ

0 голосов
/ 11 июля 2019

Я наконец-то нашел, что я делаю не так Нельзя хранить 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, когда она больше не нужна.

...