javascript — Node.js & gt; = 0.12. * C ++ Добавление экземпляра, возвращающего обратный вызов

У меня есть следующие функциональные возможности, работающие без проблем, пока параметры обратного вызова являются строковыми:

void Server::AppUse(const FunctionCallbackInfo<Value>& args) {

Isolate* isolate = Isolate::GetCurrent();

HandleScope scope(isolate);

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

Local<Function> argv[2] = {
String::NewFromUtf8(isolate, "hello world"),
String::NewFromUtf8(isolate, "hello again"),
};

nextCb->Call(isolate->GetCurrentContext()->Global(), 2, argv);

}

Реализация в узле:

var app = require('./build/Release/middleware');

app.use(function (next, again) {
console.log(next);
console.log(again);;
});

Это выводит следующий узел реализации:

$ node ./example.js
hello world
hello again

Однако теперь я хочу добавить обратный звонок. например:

void Server::AppUse(const FunctionCallbackInfo<Value>& args) {

Isolate* isolate = Isolate::GetCurrent();

HandleScope scope(isolate);

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

Local<Function> argv[1] = {
nextCb
};

nextCb->Call(isolate->GetCurrentContext()->Global(), 1, argv);

}

Это приводит к ошибке компиляции C ++:

./src/server.cc:73:63: error: no matching function for call to ‘v8::Function::Call(v8::Local<v8::Object>, int, v8::Local<v8::Function> [1])’
../src/server.cc:73:63: note: candidate is:
In file included from ~/.node-gyp/0.12.4/src/node.h:61:0,
from ../src/server.cc:1:
~/.node-gyp/0.12.4/deps/v8/include/v8.h:2557:16: note: v8::Local<v8::Value> v8::Function::Call(v8::Handle<v8::Value>, int, v8::Handle<v8::Value>*)

В основном это означает, что V8 :: Call ожидает только массив значений. Но что, если я хочу вернуть функцию? В текущей документации по аддонам нет примеров.

0

Решение

Функции являются значениями

Приведение назад и вперед на самом деле не меняет базовый объект, а предоставляет различные функции-члены. В вашем случае объявите вместо

Local<Value> argv[1] = {
nextCb
};

Некоторая информация об иерархии классов v8

Да, ARGV это массив Значение, Тем не менее, почти все (в том числе функция) — как следующее v8 диаграмма классов иллюстрирует; это взято из thlorenz.com, один из многих сайтов документации v8.

введите описание изображения здесь

Требуя Значение является почти наименее самоуверенным заявлением, поскольку оно предполагает функция является объект а также объект это Значение, таким образом функция может появиться где угодно Значение, Использование противоположного направления также разрешено с использованием Cast, но базовый объект должен быть действительным.

пример

Например, следующее законно

void someFunction(const Local<Function> &cb)
{
Local<Value> v = cb;
Local<Function> andBack = Local<Function>::Cast(v);
}
0

Другие решения


По вопросам рекламы [email protected]