2016-04-16 13 views
1

私の非同期アドオン関数内からnodejsコールバックを呼び出したいと思います。私は同期の例(here) を見て、素晴らしい非同期の例(here)を出発基盤として使用しています。NAN AsyncWorker :: ExecuteからJavascriptコールバックを呼び出すNodeJSアドオン

ただし、C++ AsyncWorker子クラスに与えられたコールバックを実行しようとすると、Segmentationフォールトが発生します。ここで

は私のコードです:

#include <nan.h> 
#include <functional> 
#include <iostream> 
#include <exception> 
using namespace Nan; 
using namespace v8; 
using namespace std; 

class ScriptWorker : public AsyncWorker { 
    public: 
    ScriptWorker(Callback *callback, const std::map<std::string, Callback*>) 
    : AsyncWorker(callback), script(script), cbs(cbs) {} 

    ~ScriptWorker() {} 

    void Execute() { 

     // ------------------------ 
     // Segmentation fault after 
     // ------------------------ 

     Local<Value> argv[] = { 
     New<v8::Number>(id) 
     }; 

     // ------------------------- 
     // Segmentation fault before 
     // ------------------------- 

     cbs["getUser"]->Call(1, argv); 
    } 

    private: 
    std::string script; 
    std::map<std::string, Callback*> cbs; 
}; 

NAN_METHOD(Method) { 
    Local<Object> array = info[0]->ToObject(); 
    Callback *callback = new Callback(info[1].As<Function>()); 

    // Build up callbacks passed in from javascript. 
    // Will be a dynamic loop, but for now, hard code the one getUser example. 
    std::map<std::string, Callback*> cbs; 
    cbs.insert(std::pair<std::string, Callback*>("getUser", 
    new Callback(
     array->Get(
     v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), "getUser") 
    ).As<Function>() 
    ) 
)); 
    AsyncQueueWorker(new ScriptWorker(callback, cbs)); 
} 

NAN_MODULE_INIT(Init) { 
    Nan::Set(target, Nan::New<String>("hello").ToLocalChecked(), Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked()); 
} 

NODE_MODULE(hello, Init) 

私の質問:

  1. 私はナンのAsyncWorkerを使用して、代わりに自分をロールではないでしょうか?
  2. Javascriptを呼び出すようにExecute関数を設定するにはどうすればよいですか?

答えて

4

EDIT:

このレポを参照してください:

https://github.com/xavero/node_addon_sample

それがコールバック関数とCの土地からの発光のイベントと連携する方法についてのサンプルを持っています。

ScriptWorkerのExecuteメソッドでv8/Nan関数を呼び出さないでください。そうしないと、セグメントエラーが発生します。 HandleOKCallback関数をオーバーライドして、javascriptコールバックを使用します。 JavaScriptから呼び出すに

は、あなたのC++のアドオンで:

NAN_MODULE_INIT(Init) { 
    Nan::Set(target, Nan::New("myJsFunctionName").ToLocalChecked(), 
    Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked()); 
} 

NODE_MODULE(anyNameHere, Init) 

そして、あなたのJavaScriptで:

// run "npm install bindings --save" in console first 
var addon = require('bindings')('NativeExtension'); 

addon.myJsFunctionName({ foo: "bar"}, (arg1,arg2) => console.log(`${arg1} - ${arg2}`)) 
+1

申し訳ありませんが、私は休暇にしているが、今、私は背中と準備ができていますこれを解決してください。 @ Xavero、私は私の例でNAN_MODULE_INITとNODE_MODULEの呼び出しを含めるのを忘れました。彼らは今そこにいる。私はあなたがV8オブジェクトとメインスレッド外の呼び出しを行うことに関してあなたが言っていることを見ています。私は古い学校に行き、uv_thread_create()とuv_async_tをuv_mutex_tと組み合わせて "カスタム"(NAN AsyncWorkerが期待するもの以外)を作る必要があると思います。何かご意見は? – EToreo

+0

コールバック(Cの非同期関数を実行し、レスポンスを含むjavascriptを実行する)を行うには、AsyncQueueWorker + ScriptWorkerを使用するのが適切です。私を信じて。 C土地のイベントを出すには、uvのライブラリ – Xavero

+0

を使用する必要があります。これは先週のプロジェクトでこれを行いました...簡単なサンプルで要点を設定しましょう。数時間をください。 – Xavero

関連する問題