我有以下功能,没有问题,所以回调参数是字符串:
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 :(得分:0)
来回转换确实不会改变底层对象,而是暴露不同的成员函数。在你的情况下,改为声明
Local<Value> argv[1] = {
nextCb
};
是的, argv 是 Value 的数组,但是,几乎所有内容(包括 Function )都是 - 如下所示 v8 类图说明;这取自thlorenz.com,这是许多v8文档站点之一。
要求值几乎是最不自觉的声明,因为它假设最少,函数是对象和对象是一个值,因此 Function 可以出现在任何需要 Value 的地方,也可以使用相反的方向Cast,但底层对象必须是实际的东西。
例如,以下是合法的
void someFunction(const Local<Function> &cb)
{
Local<Value> v = cb;
Local<Function> andBack = Local<Function>::Cast(v);
}