Javascript 在v8和Node.js中保存函数回调
如何将javascript提供的回调保存在v8包装对象中,以备将来使用,而不仅仅是在当前函数调用中使用。本质上,我想在C++中创建一个JavaScript对象,并且当用新的对象()创建一个函数回调。然后在C++对象生命中使用回调。见下例: 我遇到的问题是,当我试图在一个不同的静态函数中使用Handle对象时,它会出现故障 在节点js文件中:Javascript 在v8和Node.js中保存函数回调,javascript,node.js,v8,Javascript,Node.js,V8,如何将javascript提供的回调保存在v8包装对象中,以备将来使用,而不仅仅是在当前函数调用中使用。本质上,我想在C++中创建一个JavaScript对象,并且当用新的对象()创建一个函数回调。然后在C++对象生命中使用回调。见下例: 我遇到的问题是,当我试图在一个不同的静态函数中使用Handle对象时,它会出现故障 在节点js文件中: var Object = require("./customModule"); var obj = new Object(function(){consol
var Object = require("./customModule");
var obj = new Object(function(){console.log("Callback called...")})
// Emit callback
obj.emitCallback();
< C++模块头> /p>
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"));
}
class对象:公共节点::ObjectWrap{
公众:
静态void Init(v8::Handle目标);
对象();
受保护的:
v8::处理m_faceDetectCallback;
静态v8::handlenew(constv8::Arguments和args);
静态v8::Handle onEmitCallback(常量v8::参数和参数);
}
v8::句柄对象::新建(常量v8::参数和参数){
手镜镜;
Object*obj=新对象();
obj->Wrap(args.This());
obj->m_faceDetectCallback=Handle::Cast(args[0]);
//obj->m_faceDetectCallback=v8::Persistent::Cast(args[0]);
//这里很好用。
常量无符号argc=1;
本地argv[argc]={Local::New(String::New(“helloworld”))};
obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(),argc,argv);
返回args.This();
}
静态v8::Handle对象::onEmitCallback(常量v8::参数和参数){
手镜镜;
Object*obj=ObjectWrap::Unwrap(args.This());
常量无符号argc=1;
本地argv[argc]={Local::New(String::New(“helloworld”))};
//!!这里有故障
如果(obj->m_faceDetectCallback->IsCallable()){
//obj->m_faceDetectCallback->Call(Context::GetCurrent()->Global(),argc,argv);
}
返回scope.Close(v8::String::New(“启动调用”);
}
您需要使用v8::Persistent
而不是标准句柄Handle
是Local
和Persistent
的基类,因此通过执行您正在执行的强制转换,您可以获取指向v8::Function
的指针,但不会执行任何会告诉v8不要对其进行垃圾收集的操作
在你的课堂上:
v8::Persistent<v8::Function> m_faceDetectCallback;
v8::持久m_faceDetectCallback;
分配给
obj->m_faceDetectCallback = v8::Persistent<v8::Function>::New(args[0]);
obj->m_faceDetectCallback=v8::Persistent::New(args[0]);
哇,这给我带来了很多麻烦!非常感谢:)似乎在当前版本的V8中,您需要为持久化句柄创建一个函数。之后您将如何调用此函数?我不知道在faceDetectCallback->Call first Arguments中使用什么我使用了v8::Handle obj=v8::Context::GetCurrent()->Global()作为第一个参数,它工作得很好。第一个参数实际上表示在执行函数的js代码时用什么替换“this”。如何在v8 14.x版本中实现?