web-dev-qa-db-ja.com

V8オブジェクトをポインターに変換するにはどうすればよいですか?

Nodeアプリケーション(TSで))を書いています。これは、いくつかのネイティブライブラリとインターフェイスする必要があります。

私はライブラリ(Cで書かれています)を持っています-それはブラックボックスだと考えましょう-そして私はNANを使ってラッパーを書いています。ライブラリのネイティブインターフェイスは、次の関数に簡略化できます。

typedef void (*got_message_reply_cb)(context ctx, void * priv, struct X * the_reply);

context lib_connect();
bool lib_send_message(context ctx, message msg, got_message_reply_cb callback, void * priv);

これは非常に簡単に理解できると思います。

だから、私はそのブラックボックスネイティブライブラリを次のようなものにラップしようとしています:

class TheLibrary : public Nan::ObjectWrap {
    Initialize(v8::Handle<v8::Object> target);
    SendMessage(...)
}

そして、次のようなjavascriptオブジェクトに:

class TheLibrary {
    SendMessage(message: whatever, callback: (reply) => void); // or return promise, doesn't matter
}

NAN C++モジュールでコールバックを実際に処理するにはどうすればよいですか?どういうわけかコールバックを渡す必要があります(おそらくLocal<Function>-関数へのポインタとして、私が正しく理解していれば、スコープが制限されているため、それを取得します。どうやってするか?お返事ありがとうございます。

29
Mike S.

高レベルの答えは、JSコールバック関数を直接渡さないで、何らかの形でJSコールバックをコンテキスト値として持つ関数へのポインターを渡します(例ではprivパラメーター)。

したがって、あなたのケースでは、次のようなものを書きます:

_void TheLibraryCallback(context ctx, void *instance, struct X *the_reply) {
    ((TheLibrary*)instance)->callback(ctx, the_reply);
}
_

TheLibraryに、コールバックを処理するメソッドvoid callback(context ctx, struct X * the_reply)を追加します。ライブラリは次のように呼び出します:thisTheLibraryインスタンスであるlib_send_message(ctx, msg, TheLibraryCallback, this);.

では、コールバックメソッドでJSコールバックをどのようにコールバックするのでしょうか。 nanでは、メインスレッドに戻っていることを確認する必要があります。 examples がありますが、代わりに新しい N-API を使用することをお勧めします。 AsyncWorker は、メインスレッドでコールバックを呼び出すために必要なボイラープレートに役立ちます。

1
Fozi