您如何将 javascript 提供的回调保存在 v8 包装对象中以供将来使用,而不仅仅是在当前函数调用中。本质上,我想在 C++ 中创建一个 javascript 对象,并在使用 new Object() 创建时提供一个函数回调。然后在整个 c++ 对象生命周期中使用该回调。请参见下面的示例:
我遇到的问题是,当我尝试在不同的静态函数中使用 Handle 对象时,它会出现故障。
在节点 js 文件中:
var Object = require("./customModule");
var obj = new Object(function(){console.log("Callback called...")})
// Emit callback
obj.emitCallback();
在 C++ 模块头中
class Object : public node::ObjectWrap {
public:
static void Init(v8::Handle<v8::Object> target);
Object();
protected:
v8::Handle<v8::Function> m_faceDetectCallback;
static v8::Handle<v8::Value> New(const v8::Arguments& args);
static v8::Handle<v8::Value> onEmitCallback(const v8::Arguments& args);
}
v8::Handle<v8::Value> Object::New(const v8::Arguments& args) {
HandleScope scope;
Object* obj = new Object();
obj->Wrap(args.This());
obj->m_faceDetectCallback = Handle<Function>::Cast(args[0]);
//obj->m_faceDetectCallback = v8::Persistent<Function>::Cast(args[0]);
// Works fine here.
const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(), argc, argv);
return args.This();
}
static v8::Handle<v8::Value> Object::onEmitCallback(const v8::Arguments& args){
HandleScope scope;
Object* obj = ObjectWrap::Unwrap<Object>(args.This());
const unsigned argc = 1;
Local<Value> argv[argc] = { Local<Value>::New(String::New("hello world")) };
//!! Segfaults here
if(obj->m_faceDetectCallback->IsCallable()){
//obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(), argc, argv);
}
return scope.Close(v8::String::New("Start called"));
}