Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从NanAsyncWorker返回新对象?_C++_Node.js_V8_Node Modules_Node.js Addon - Fatal编程技术网

C++ 如何从NanAsyncWorker返回新对象?

C++ 如何从NanAsyncWorker返回新对象?,c++,node.js,v8,node-modules,node.js-addon,C++,Node.js,V8,Node Modules,Node.js Addon,我正在开发node.js/io.js本机插件,需要从异步回调创建一个新的本机对象 使用nan帮助程序,我得到了如下结果: class MyObject : public node::ObjectWrap { /* definition */ }; class MyWorker : public NanAsyncWorker { bool varForMyObject; virtual void Execute() {/* do stuff and sets varForMyObject

我正在开发node.js/io.js本机插件,需要从异步回调创建一个新的本机对象

使用nan帮助程序,我得到了如下结果:

class MyObject : public node::ObjectWrap
{ /* definition */ };

class MyWorker : public NanAsyncWorker
{
  bool varForMyObject;
  virtual void Execute() {/* do stuff and sets varForMyObject */}

  virtual void HandleOKCallback() {
    NanScope();

    MyObject* obj = new MyObject(varForMyObject);

    Local<Value> argv[] = {
      NanNull(),
      obj // ???
    };

    callback->Call(2, argv);
  }
};
类MyObject:public节点::ObjectWrap
{/*定义*/};
类MyWorker:公共工作者
{
bool-varForMyObject;
虚拟void Execute(){/*执行填充并设置varForMyObject*/}
虚拟void HandleOKCallback(){
NanScope();
MyObject*obj=新的MyObject(varForMyObject);
本地argv[]={
NanNull(),
obj/???
};
回调->调用(2,argv);
}
};
在没有访问args参数的情况下,我无法理解如何包装对象


帮助?

您应该手动创建javascript对象,例如:

//some_class.h

class SomeClass {
public:
    std::string id;
    int value;
    SomeClass() {};
    SomeClass(std::string id, int value): id(id), value(value) {};

    static SomeClass *unpack(v8::Isolate *isolate, const v8::Local<v8::Object> object) {
        using namespace v8;

        SomeClass *p = new SomeClass();
        Local<Value> _id = object->Get(String::NewFromUtf8(isolate, "id"));

        String::Utf8Value utf8String(_id);
        p->id = std::string(*utf8String);
        p->value = static_cast<int>(object->Get(String::NewFromUtf8(isolate, "value"))->NumberValue());

        return p;
    }

    static v8::Local<v8::Object> pack(v8::Isolate *isolate, const SomeClass *object) {
        using namespace v8;
        Local<Object> obj = Object::New(isolate);

        obj->Set(String::NewFromUtf8(isolate, "id"), String::NewFromUtf8(isolate, object->id.c_str()));
        obj->Set(String::NewFromUtf8(isolate, "value"), Integer::New(isolate, object->value));

        return obj;
    };
}
//some_class.h
上课{
公众:
std::字符串id;
int值;
SomeClass(){};
SomeClass(std::stringid,int-value):id(id),value(value){};
静态SomeClass*解包(v8::隔离*隔离,常量v8::本地对象){
使用名称空间v8;
SomeClass*p=新的SomeClass();
本地_id=object->Get(字符串::NewFromUtf8(隔离,“id”);
字符串::Utf8Value utf8String(_id);
p->id=std::string(*utf8String);
p->value=static_cast(对象->获取(字符串::NewFromUtf8(隔离,“值”)->NumberValue());
返回p;
}
静态v8::本地包(v8::隔离*隔离,常量SomeClass*对象){
使用名称空间v8;
本地对象=对象::新建(隔离);
obj->Set(String::NewFromUtf8(隔离,“id”),String::NewFromUtf8(隔离,对象->id.c_str());
对象->设置(字符串::NewFromUtf8(隔离,“值”),整数::新建(隔离,对象->值));
返回obj;
};
}
然后在你的工人中:

class MyObject : public node::ObjectWrap
{ /* definition */ };

class MyWorker : public NanAsyncWorker
{

  virtual void Execute() {/* do stuff and sets varForMyObject */}

  virtual void HandleOKCallback() {
    NanScope();

   SomeClass *c = new SomeClass("id", 123);


    Local<Value> argv[] = {
      NanNull(),
      SomeClass::pack(v8::Isolate::GetCurrent(), c)
    };

    callback->Call(2, argv);
  }
};
类MyObject:public节点::ObjectWrap
{/*定义*/};
类MyWorker:公共工作者
{
虚拟void Execute(){/*执行填充并设置varForMyObject*/}
虚拟void HandleOKCallback(){
NanScope();
SomeClass*c=新的SomeClass(“id”,123);
本地argv[]={
NanNull(),
SomeClass::pack(v8::Isolate::GetCurrent(),c)
};
回调->调用(2,argv);
}
};

肯定有更好的方法吗?