私は、ロギング情報をNanからJavaScriptに渡すためのC++ライブラリのノードモジュールラッパーを構築しています。このためにNAN_Methodをコールバックを登録することができます。コールバックハンドラは、C++ライブラリのコールバックとしてvlAddLogListener()
経由で自身を登録する必要があります。 LoggingCallbackHandler
は、関数dispatchEvent
(C++関数)でライブラリからメッセージを受け取ります。ログを受け取った場合、データを渡すためにJavaScriptコールバックを呼び出す必要があります。node.js Nan:C++関数でJavaScriptコールバックを呼び出す
関数dispatchEvent
はNanコンテキストで呼び出されないため、スコープとコンテキストがなくv8へのアクセス権がありません。 JavaScriptコールバックをどのように呼び出すことが可能ですか?
コードは次のようになります。
Nan
を使用して
NAN_METHOD(registerLoggingCallback)
{
v8::Isolate* isolate = info.GetIsolate();
v8::Local<v8::Function> fun = info[0].As<v8::Function>();
lch = new LoggingCallbackHandler(isolate, fun);
}
LoggingCallbackHandler::LoggingCallbackHandler(v8::Isolate* isolate, v8::Local<v8::Function> fun) :
_cb(isolate, fun)
{
vlAddLogListener(&LoggingCallbackHandler::dispatchEvent, this);
}
void VL_CALLINGCONVENTION LoggingCallbackHandler::dispatchEvent(const char* eventData, void* clientData)
{
// here I want to process the data and call the JavaScript callback
v8::Local<v8::Function> f = v8::Local<v8::Function>::New(Nan::GetCurrentContext()->Global()->GetIsolate(), _cb);
Nan::MakeCallback(Nan::GetCurrentContext()->Global(), f, argc, argv);
}