gpt4 book ai didi

javascript - 在 v8 和 Node.js 中保存函数回调

转载 作者:数据小太阳 更新时间:2023-10-29 04:07:21 25 4
gpt4 key购买 nike

您如何将 javascript 提供的回调保存在 v8 包装对象中,以供将来不仅在当前函数调用中使用。本质上,我想在 C++ 中创建一个 javascript 对象,并在使用 new Object() 创建时提供一个函数回调。然后在整个 C++ 对象生命周期中使用该回调。请参见下面的示例:

我遇到的问题是,当我尝试在不同的静态函数中使用 Handle 对象时,它会出现段错误。

在 Node 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"));
}

最佳答案

您需要使用 v8::Persistent 而不是标准句柄。 HandleLocalPersistent 的基类,因此通过执行您正在执行的转换,您将获取指向 的指针v8::Function 但不做任何会告诉 V8 不要对其进行垃圾收集的事情。

在你的类里面:

v8::Persistent<v8::Function> m_faceDetectCallback;

并分配给

obj->m_faceDetectCallback = v8::Persistent<v8::Function>::New(args[0]);

关于javascript - 在 v8 和 Node.js 中保存函数回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12888068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com