c++ - 将对象从 C++ 代码传递到回调函数

标签 c++ node.js callback

我正在为 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 对象:

  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

最佳答案

好的,谢谢大家:-) 我找到了正确的方法。这是一个静态方法,它创建一个 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;
}

关于c++ - 将对象从 C++ 代码传递到回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10288403/

相关文章:

java - 是否可以在监听更改的变量上创建注释?

c++ - 如何包装模板函数以处理 const 和非常量数据

c++ - Copy ctor 在 VS2015 中未按预期运行

c++ - 在另一个 VS 项目中引用函数模板的显式实例化时出现 LNK2019 错误

javascript - 如何在 node.js 中访问 JSON 对象的动态键值?

javascript - 在查找中更新文档

iOS Today Extension NSUserDefaults 使用回调与包含应用程序共享数据

c++ - 使用 AVX2 C++ 选择性加载

node.js - Express.js 中如何跨模块访问 req 和 res?

c++ - 保存并传递给 C++ 中模板参数的函数列表