2012-04-23 45 views
0

我寫Agueas [1]爲插件Node.js的傳遞對象到由C回調函數++代碼

現在我已經同步碼,C++類如下所示:

class LibAugeas : public node::ObjectWrap { 
public: 
    static void Init(Handle<Object> target); 

protected: 
    augeas * m_aug; 
    LibAugeas(); 
    ~LibAugeas(); 

    static Handle<Value> New(const Arguments& args); 

    static Handle<Value> get  (const Arguments& args); 
    static Handle<Value> set  (const Arguments& args); 
    static Handle<Value> setm  (const Arguments& args); 
    // other methods 
}; 

的用法這個類在JS:

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

我要推動異步代碼。

瓶頸是創建augeas對象(aug_init),而所有或一些鏡頭和文件正在加載和解析。這樣的想法是創建augeas異步對象,然後通過創建JS對象的回調函數:

  1. 用純C線:調用aug_init(),aug_load()得到augeas處理。
  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 :-('); 
     } 
    } 
); 

最後,我的問題:我不知道如何在C++創建JS對象:-)

構造static Handle<Value> New(const Arguments& args);回報args.This(),但是當我在C++代碼中時,我沒有args,也無法包裝對象。

那麼,如何在C++中創建JS對象?請不要傷我的心臟說:-)

[1] http://augeas.net

回答

0

好,感謝大家:-) 我已經找到了正確的方法是不可能的。這裏是一個靜態方法,它創建一個JS對象,給定augeas句柄。 然後我可以將這個對象從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

更新:對象tenplate可能會創建一次,也可能會重用FunctionTemplate。 – Igor 2012-04-25 11:25:46