将V8对象转换为指针

Mik*_* S. 25 c++ native node.js

我正在编写一个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);
Run Code Online (Sandbox Code Playgroud)

我相信这很容易理解.

所以,我试图将这个黑盒子本机库包装成:

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

然后到javascript对象,如:

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

如何在NAN C++模块中实际处理回调?我需要以某种方式传递回调(可能由Local<Function>- 表示,如果我理解正确,范围有限)作为指向函数的指针,然后将其检索回来.怎么做?谢谢你的回复.

Foz*_*ozi 1

高级答案是,您不直接传递 JS 回调函数,而是传递一个指向函数的指针,该函数以某种方式将 JS 回调作为上下文值(在您的示例中为参数priv)。

因此,对于您的情况,您可以写这样的内容:

void TheLibraryCallback(context ctx, void *instance, struct X *the_reply) {
    ((TheLibrary*)instance)->callback(ctx, the_reply);
}
Run Code Online (Sandbox Code Playgroud)

在您的中添加一个处理回调的TheLibrary方法。void callback(context ctx, struct X * the_reply)您可以这样调用您的库:lib_send_message(ctx, msg, TheLibraryCallback, this);作为this一个TheLibrary实例。

那么你的回调方法中如何回调JS回调呢?您必须nan确保回到主线程。那里有一些示例,但我建议您改用新的N-API。AsyncWorker帮助您完成在主线程中调用回调所需的样板