所以我正在用 C++ 编写一个 node.js 模块,它处理来自相机的数据。app.js
每当有新数据可用时,我想在我的文件中调用一个回调函数。
我现在拥有的
现在,我的节点 javascript 文件 ( app.js
) 中有以下代码。它每秒调用我的 C++ 模块中的一个函数并返回到目前为止已处理的帧数:
setInterval(function () {
var counter = MyCPPModule.NumberOfFrames();
console.log(counter);
}, 1000);
在我的 C++ 文件中,我有以下功能。
1.)我有一个函数来获取帧数 - 如上所述从 javascript 调用的函数 -frameCounter
指的是全局变量。
void NumberOfFrames(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Local<Integer> retval = v8::Integer::New(isolate, frameCounter);
args.GetReturnValue().Set(retval);
}
2.)而且我在 C++ 模块中有一个 C++-callback 函数,只要有新的帧可用就会触发(为了清楚起见,这个回调独立于 node.js 并且与 node.js-callbacks 没有直接关系)。
void NewFrameAvailable(char** imageBuffer, /* more arguments */)
{
// ...
frameCounter++; // increment global variable
// ...
}
所有这一切都很好。
我想完成什么
setInterval
而不是在我的 javascript 代码中注册一个函数。我想以某种方式在我的 C++ 模块中注册一个函数,只要相机有新帧可用,该函数就会被重复调用。它的行为应该像setInterval
,但不是每秒触发一次,而是在帧可用时触发。
我希望在 javascript 端的代码类似于:
MyCPPModule.setMyFrameInterval(function (msg) {
console.log(msg);
});
在 C++ 模块中,我想做类似的事情:
void NewFrameAvailable(char** imageBuffer, /* more arguments */)
{
// ...
frameCounter++; // increment global variable
Local<Function> cb = /* WHAT DO I DO HERE*/ ;
Isolate*isolate = /* WHAT DO I DO HERE */;
const unsigned argc = 1;
Local<Value> argv[argc] = { String::NewFromUtf8(isolate, std::to_string(frameCounter)) };
cb->Call(Null(isolate), argc, argv);
// ...
}
和一个注册 javascipt-callback 的函数setMyFrameInterval
:
void setMyFrameInterval(const FunctionCallbackInfo<Value>& args) {
Local<Function> cb = Local<Function>::Cast(args[0]); // make this somehow global?
Isolate*isolate = args.GetIsolate()
//...
}
那么,如何从NewFrameAvailable
(当帧可用时触发的 C++ 回调函数)调用 javascript 回调。我想我基本上必须以某种方式使 javascript 函数在函数中全局可用,setMyFrameInterval
以便函数也知道它newFrameAvailable
。我该怎么做呢?