2015-05-01 2 views
1

Я работаю над родным плагином node.js/io.js, и мне нужно создать новый собственный объект из асинхронного обратного вызова.Как вернуть новый объект из NanAsyncWorker?

Использование хелперов нан, у меня есть что-то, что выглядит как:

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); 
    } 
}; 

Я не могу понять, как обернуть объект, не имея доступа к параметрам арг.

Помощь?

ответ

2

Вы должны создать объект яваскрипта вручную, например:

//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; 
    }; 
} 

затем в вашем работника:

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); 
    } 
}; 
+0

Конечно, есть лучший способ? – Bungles