[英]Saving a function callback in v8 and Node.js
How would you save a javascript supplied callback in a v8 wrapped object for future use not only in the current function call. 如何在v8包装对象中保存javascript提供的回调,以便将来不仅在当前函数调用中使用。 Essentially i want to create a javascript object in C++ and when created with new Object() supply a function callback. 基本上我想用C ++创建一个javascript对象,当用新的Object()创建时,提供一个函数回调。 Then use that callback throughout the c++ objects life. 然后在整个c ++对象生命中使用该回调。 See example below: 见下面的例子:
The issue im having is when I try to use the Handle object in a different static function it seg faults. 我遇到的问题是当我尝试在不同的静态函数中使用Handle对象时它会出错。
In node js file: 在节点js文件中:
var Object = require("./customModule");
var obj = new Object(function(){console.log("Callback called...")})
// Emit callback
obj.emitCallback();
In c++ module header 在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"));
}
You need to use v8::Persistent
instead of a standard handle. 您需要使用v8::Persistent
而不是标准句柄。 Handle
is the base class for Local
and Persistent
so by doing the cast that you are doing, you are grabbing a pointer to the v8::Function
but not doing anything that would tell V8 not to garbage-collect it. Handle
是Local
和Persistent
的基类,所以通过执行你正在进行的转换,你抓住了一个指向v8::Function
的指针,但没有做任何会告诉V8不要垃圾收集它的东西。
With this in your class: 在你的课堂上这个:
v8::Persistent<v8::Function> m_faceDetectCallback;
and assigned with 并指派
obj->m_faceDetectCallback = v8::Persistent<v8::Function>::New(args[0]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.