我正在编写一个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>
表示,如果我正确理解的话,它的作用域有限)作为指向该函数的指针,然后将其取回。怎么做?感谢您的答复。
答案 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);
,其中this
是TheLibrary
实例。
那么您如何在回调方法中回调JS回调?使用nan
,您必须确保返回主线程。这里有examples,但我建议您改用新的N-API。 AsyncWorker帮助您完成在主线程中调用回调所需要的样板。