如何从NanAsyncWorker返回一个新对象

How to return a new object from NanAsyncWorker?

本文关键字:一个 新对象 对象 NanAsyncWorker 返回      更新时间:2023-10-16

我正在开发一个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 参数的情况下包装对象。

帮助?

你应该手动创建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);
  }
};