使用node-addon-api保存回调以备以后使用的方法如下:
Napi::FunctionReference
类来保存JavaScript回调函数的引用。class CallbackHolder {
public:
CallbackHolder(Napi::Env env, Napi::Function callback) : callback_(Napi::Persistent(callback)) {
callback_.SuppressDestruct();
}
void CallCallback() {
Napi::Env env = callback_.Env();
Napi::HandleScope scope(env);
callback_.MakeCallback(env.Global(), {});
}
private:
Napi::FunctionReference callback_;
};
std::map
来保存回调函数的实例。std::map<std::string, std::shared_ptr<CallbackHolder>> callbackMap;
Napi::Value SaveCallback(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 2 || !info[0].IsString() || !info[1].IsFunction()) {
Napi::TypeError::New(env, "Invalid arguments").ThrowAsJavaScriptException();
return env.Undefined();
}
std::string callbackName = info[0].As<Napi::String>().Utf8Value();
Napi::Function callback = info[1].As<Napi::Function>();
callbackMap[callbackName] = std::make_shared<CallbackHolder>(env, callback);
return env.Undefined();
}
Napi::Value CallSavedCallback(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsString()) {
Napi::TypeError::New(env, "Invalid arguments").ThrowAsJavaScriptException();
return env.Undefined();
}
std::string callbackName = info[0].As<Napi::String>().Utf8Value();
auto it = callbackMap.find(callbackName);
if (it != callbackMap.end()) {
it->second->CallCallback();
}
return env.Undefined();
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "saveCallback"), Napi::Function::New(env, SaveCallback));
exports.Set(Napi::String::New(env, "callSavedCallback"), Napi::Function::New(env, CallSavedCallback));
return exports;
}
NODE_API_MODULE(addon, Init)
const addon = require('addon');
addon.saveCallback('myCallback', () => {
console.log('Saved callback called');
});
addon.callSavedCallback('myCallback'); // 输出:Saved callback called
这样,你就可以使用node-addon-api保存回调以备以后使用了。请注意,上述示例中的代码仅为演示目的,实际使用时可能需要根据具体需求进行适当修改。
领取专属 10元无门槛券
手把手带您无忧上云