Как использовать сложные типы данных v8 в асинхронном рабочем классе модуля нативного узла?

Я пытаюсь сделать методы моего модуля узла асинхронными. Я создал класс AsyncWorker, но наткнулся на несколько вещей:/

Мой Nan::AsyncWorker выглядит следующим образом...

class PackerWorker : public Nan::AsyncWorker {
 public:
  PackerWorker(Nan::Callback *callback, v8::Handle<v8::Array> messageFields)
    : AsyncWorker(callback), messageFields(messageFields) {}
  ~PackerWorker() {}

  // Executed inside the worker-thread.
  // It is not safe to access V8, or V8 data structures
  // here, so everything we need for input and output
  // should go on `this`.
  void Execute () {
    //pack_iso8583(messageFields);
  }

  // Executed when the async work is complete
  // this function will be run inside the main event loop
  // so it is safe to use V8 again
  void HandleOKCallback () {
    //Nan::HandleScope scope;
    v8::Local<v8::Value> argv[] = { // currently just dummy values need to return v8::Local<v8::Array> result here!
        Nan::Null()
      , Nan::New<v8::Number>(1.75) 
    };

    callback->Call(2, argv);
  }

 private:
  v8::Handle<v8::Array> messageFields;
  //v8::Local<v8::Array> result;
};

-

  void Execute () {
    result = pack_iso8583(messageFields);
  }

При реализации этого метода происходит сбой вызова без дополнительной информации. Дальнейшее чтение указывает на то, что доступ к структурам данных V8 или V8 небезопасен. Так что я думаю, что это причина, потому что метод синхронизации работает.

  1. Нужно ли конвертировать все переменные в Nan типы данных? Если так, что эквивалентно в Nan:: в v8::Local<v8::Array> а также v8::Handle<v8::Array> а как конвертировать их и наоборот?
  2. Как получить полезную информацию об исключении, когда C++ код не выполняется?

Полный исходный код доступен здесь: https://github.com/s-a/iso-8583/blob/30ac35796ba5014ad5668ac2919fddcb3b082580/functions.cc#L144. Просто клонируйте репо и npm install а также npm test

Может, кому-то нравится создавать пиар:), в любом случае, я очень рад любым подсказкам! Я просто надеялся, что было бы более тривиально сделать существующие методы асинхронными ^^

0 ответов

Другие вопросы по тегам