Как вернуть новый объект из NanAsyncWorker?

Я работаю над нативным плагином 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);
}
};

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

Помогите?

1

Решение

Вы должны создать объект 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;
};
}

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

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

Другие решения


По вопросам рекламы [email protected]