2013-04-11 64 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