2014-12-19 6 views
2

У меня есть файл javascript, и я хочу вызвать некоторую функцию, определенную в этом файле во время вызова моей функции C++. Обратите внимание, что я хочу назвать его по имени, а не только некоторой случайной функцией, переданной как аргумент.вызов функции javascript из C++ node.js extension

test.js:

function someFunc() 
{ 
    // do something... 
} 

var my_module = require("my_native_module"); 
my_module.nativeFunc(); 

test.cpp:

using namespace v8; 

Handle<Value> nativeFunc(const Arguments & args) 
{ 
    HandleScope scope; 
    // I want to somehow get someFunc value from current context by name 
    Local<Value> function_value = Context::GetCurrent()->Global()->Get_By_Name(String::New("someFunc")); // this doesn't work 
    // probably check that function_value is really a function... 
    Local<Function> function_callable = Local<Function>::Cast(function_value); 
    function_callable->Call(Context::GetCurrent()->Global(), 0, nullptr); 
    return(scope.Close(Undefined())); 
} 

Все примеры, кажется, принимают эту функцию в качестве аргумента (обратный вызов), как это:

Local<Function> cb = Local<Function>::Cast(args[0]); 

Но вместо этого мне нужно найти функцию по имени.

ответ

0

Я не быстрый пример готов проверить это, но глядя на код, который означает, что вы должны быть в состоянии сделать что-то вроде этого:

Handle<String> process_name = String::NewFromUtf8(GetIsolate(), "Foo"); 
    Handle<Value> process_val = context->Global()->Get(process_name); 

    if (!process_val->IsFunction()) return false; 

    Handle<Function> process_fun = Handle<Function>::Cast(process_val); 

    process_fun->Call(Context::GetCurrent()->Global(), 0, nullptr); 
+0

Я использую Node.js v0. 10.33 и v8 :: String не имеет метода NewFromUtf8. Глядя на документацию v8, предполагается, что NewFromUtf8 присутствует там, но он отсутствует в поставляемых вместе с node.js – trbvm

+0

'NewFromUtf8' для узла v 0.12. 'String :: New (« Whatevs »)' для более старого узла. – carter

Смежные вопросы