我正在为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对象:
用法可能是这样的:
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对象?请不要伤心说不可能: - )
答案 0 :(得分:1)
好的,谢谢大家:-) 我找到了正确的方法。这是一个静态方法,它创建一个给定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;
}