2017-08-03 12 views
2

私は、ロギング情報を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); 
} 

答えて

0

、あなたのregisterLoggingCallback関数内でNan::Callbackを使用して関数の値を保存する必要があります。

Nan::Callback cb; 
cb.Reset(info[0].As<v8::Function>()); 

ストアクラス内でこのNan::CallbackdispatchEvent関数を変更して、uv_async_tを使用して、コールバックへの呼び出しをメインスレッドで実行するようにスケジュールします。

uv_async_tの使用は、Nan::AsyncWorkerを使用して簡略化できますが、その動作をよりよく理解するには、documentationを読む方がよい場合があります。

あなたが実際にコールバックを呼び出したいときは、あなたが行うことができます:

v8::Local<v8::Value> arg = Nan::Null(); 
cb.Call(1, &arg); 

あなたは2番目のパラメータとしてv8::Local<v8::Value>の配列を渡すと、それに応じて最初のパラメータを増やすことで、コールバックの中に複数の値を渡すことができます。

関連する問題