2012-04-23 9 views
0

からのコールバック関数にオブジェクトを渡す、C++のクラスは、次のようになりますJSでこのクラス:私は同期コードを持って、私はAgueasに今のNode.jsの</p> <p>のための[1]アドオンを書いているC++コード

var lib = require('...'); 
var aug = new lib.Augeas(...); 
aug.set(...); 
aug.get(...); 
// etc 

私は非同期コードをimpelementするつもりです。

ボトルネックは、すべてまたは一部のレンズとファイルが読み込まれて解析されている間にaugeasオブジェクト(aug_init)を作成しています。だから、アイデアは非同期オブジェクト、その後、コールバック関数で作成されたJSオブジェクトを渡すaugeasを作成している:

  1. 純粋なCのスレッドを:augeasハンドルを取得するaug_init()、aug_load()を呼び出します。
  2. augeasハンドルを使用してJSオブジェクトを作成します(最初のスニペットを参照)
  3. 作成されたJSオブジェクトをコールバック関数に渡します。

使用方法は、次のようなことがあります:

lib.heracles(function(aug) { 
     if (!aug.error()) { 
      console.log('Hello!'); 

      // async save: 
      aug.save(function(err, msg) { 
       console.log(msg); 
       }); 
     } else { 
      console.log('Sad, but true :-('); 
     } 
    } 
); 

そして最後に、私の問題:私はargs.This()を返しstatic Handle<Value> New(const Arguments& args);

コンストラクタ:-) C++でJSオブジェクトを作成する方法がわかりません、しかし、私はC++のコードではargsを持っていないし、オブジェクトをラップすることもできません。

したがって、C++でJSオブジェクトを作成するにはどうすればよいですか? 、

は、[1] http://augeas.net

答えて

0

[OK]を、すべての人のおかげで:-) 私は正しい道を見つけた:-)それは可能ではないと言って私の心を破るしないでください。ここには、与えられたaugeasハンドルをラップするJSオブジェクトを作成する静的メソッドがあります。 次に、このオブジェクトをC++コードからコールバック関数に渡すことができます。

Local<Object> LibAugeas::New(augeas *aug) 
{ 
    LibAugeas *obj = new LibAugeas(); 
    obj->m_aug = aug; 

    Handle<ObjectTemplate> tpl = ObjectTemplate::New(); 
    tpl->SetInternalFieldCount(1); // one field for LibAugeas* pointer (via obj->Wrap()) 

#define _OBJ_NEW_METHOD(m) NODE_SET_METHOD(tpl, #m, m) 
    _OBJ_NEW_METHOD(get); 
    _OBJ_NEW_METHOD(set); 
    _OBJ_NEW_METHOD(setm); 
    _OBJ_NEW_METHOD(rm); 
    _OBJ_NEW_METHOD(mv); 
    _OBJ_NEW_METHOD(save); 
    _OBJ_NEW_METHOD(nmatch); 
    _OBJ_NEW_METHOD(insert); 
    _OBJ_NEW_METHOD(error); 

    Local<Object> O = tpl->NewInstance(); 
    obj->Wrap(O); 
    return O; 
} 
+0

更新:オブジェクトテンプレートを1回作成することもできますし、FunctionTemplateを再利用することもできます。 – Igor

関連する問題