使用 C++ std::vector 存储 Node.js 回调函数
以下是一个简单的示例,展示如何在 C++ 中使用 std::vector 存储 Local<Function> 类型,并将其作为 Node.js 模块导出。
#include <node.h>
#include <vector>
using v8::Function;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
// 定义一个 std::vector 存储 Local<Function> 类型
std::vector<Local<Function>> callbackVector;
// 添加函数,将传入的回调函数存储到vector中
void AddCallback(const FunctionCallbackInfo<Value>& args) {
if (args.Length() < 1) {
return;
}
Local<Function> callback = Local<Function>::Cast(args[0]);
callbackVector.push_back(callback);
}
// 触发函数,依次调用vector中所有存储的回调函数
void TriggerCallbacks(const FunctionCallbackInfo<Value>& args) {
for (auto& callback : callbackVector) {
callback->Call(args.GetIsolate()->GetCurrentContext(), Null(args.GetIsolate()), 0, nullptr);
}
}
// 初始化模块
void Init(Local<Object> exports) {
NODE_SET_METHOD(exports, "addCallback", AddCallback);
NODE_SET_METHOD(exports, "triggerCallbacks", TriggerCallbacks);
}
NODE_MODULE(NODE_GYP_MODULE_NAME, Init)
在该模块中,我们先定义了一个 std::vector 变量 callbackVector,用于存储 Local<Function> 类型的回调函数。然后,我们添加了两个函数 AddCallback 和 TriggerCallbacks,分别用于将回调函数存储到 vector 中并依次调用 vector 中所有存储的回调函数。最后,我们将这两个函数导出到 Node.js 中,以便 JavaScript 代码可以调用它们。
在 Node.js 中,我们可以这样使用该模块:
const callbackModule = require('./callbackModule');
function myCallback() {
console.log('Callback called');
}
callbackModule.addCallback(myCallback);
callbackModule.addCallback(myCallback);
callbackModule.triggerCallbacks();
在上面的示例中,我们首先将 myCallback 函数两次添加到 callbackModule 模块中。然后,我们调用 triggerCallbacks 函数,该函数将依次调用 callbackVector 中存储的两个 myCallback 函数。在控制台中,我们将看到“Callback called”输出两次。
原文地址: https://www.cveoy.top/t/topic/on9V 著作权归作者所有。请勿转载和采集!