1

ノード モジュール メソッドを非同期にしようとしています。私は 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/sa/iso-8583/blob/30ac35796ba5014ad5668ac2919fddcb3b082580/functions.cc#L144 で入手できます。npm installリポジトリを複製するだけですnpm test

誰かが PR を作成するのが好きかもしれません :) とにかく、役立つヒントがあればとてもうれしいです! 既存のメソッドを非同期にすることがもっと簡単になることを願っていました ^^

4

0 に答える 0