将V8对象转换为指针

时间:2018-11-09 19:05:50

标签: javascript c++ node.js native

我正在编写一个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>表示,如果我正确理解的话,它的作用域有限)作为指向该函数的指针,然后将其取回。怎么做?感谢您的答复。

1 个答案:

答案 0 :(得分:1)

高层回答是,您不直接传递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)。您可以这样调用您的库:lib_send_message(ctx, msg, TheLibraryCallback, this);,其中thisTheLibrary实例。

那么您如何在回调方法中回调JS回调?使用nan,您必须确保返回主线程。这里有examples,但我建议您改用新的N-APIAsyncWorker帮助您完成在主线程中调用回调所需要的样板。