2013-04-11 47 views
0

我正在写与接受任意长度参数的函数使Node.js的本机模块,它是与此相似的JS:如何使用v8 :: Arguments应用回调?

cb = function() 
{ 
    // Receive arguments and do something... 
} 

foo = function() 
{ 
    cb.apply({}, arguments) 
} 

foo([1,2,3]) 
foo([4]) 

这里,foo应用cb任意参数。

而C++版本,根据有关回调最Node.js的文章,想这样:

Handle<Value> Foo(const Arguments& args) 
{ 
    HandleScope scope; 

    // Assume that we can get callback from somewhere else. 
    Local<Function> cb = getExistingCallback(); 

    // Now call it with arbitrary arguments. 
    cb->Call(Object::New(), args.Length(), args.Data()); 

    return scope.Close(Undefined()); 
} 

Arguments::Data只能提供v8::Local<v8::Value>&, 不v8::Handle<v8::Value>*,所以编译器会引发错误。

因为Local派生自Handle,所以不是问题所在。我只是不,如果有任何解决方案,我可以用来避免将所有成员从Data复制到一个新的阵列,然后通过它。

回答

1

Arguments::Data是不是你想要的。如果您查看the source,那么这些数据与传递给函数本身的值完全无关。 Dataimplicit_args_读取数据,而您想要的数据是values_

我不认为有一种简单的方法可以在不使用operator[]的情况下得到这些信息,所以也许最好的办法是动态构建列表?您可以使用std::vector,因为它的数据值是连续的。

int argc = args.Length(); 
std::vector<Local<Value>> argv; 
for (int i = 0; i < argc; i++){ 
    argv.push_back(args[i]); 
} 
cb->Call(Object::New(), argc, &argv[0]); 
+0

谢谢。复制循环是我所担心的,因为它会在每次应用回调时执行,即使函数已经包含了“参数”中的所有信息。但如果这是做到这一点的唯一方法,我会服从。 – snowmantw 2013-04-11 05:36:06

+0

'class Handle '中的唯一数据成员是'T *',所以它应该和复制指针没有区别,所以我不担心它的性能。如果你想避免多次分配,你当然也可以调用'argv.reserve(argc)'。 – loganfsmyth 2013-04-11 05:40:38