Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在v8和Node.js中保存函数回调_Javascript_Node.js_V8 - Fatal编程技术网

Javascript 在v8和Node.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

如何将javascript提供的回调保存在v8包装对象中,以备将来使用,而不仅仅是在当前函数调用中使用。本质上,我想在C++中创建一个JavaScript对象,并且当用新的对象()创建一个函数回调。然后在C++对象生命中使用回调。见下例:

我遇到的问题是,当我试图在一个不同的静态函数中使用Handle对象时,它会出现故障

在节点js文件中:

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版本中实现?