Node.js用のAgueas [1]アドオンを書いています
今のところ同期コードがあり、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 オブジェクトをコールバック関数に渡すという考え方です。
- 純粋な C スレッド: aug_init()、aug_load() を呼び出して augeas ハンドルを取得します。
- 準備ができたら、augeas ハンドルを使用して JS オブジェクトを作成します (最初のスニペットを参照)。
- 作成した 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 オブジェクトを作成するにはどうすればよいでしょうか。それが不可能だと言って私の心を壊さないでください:-)