0

只要回调参数是字符串,我就可以正常使用以下功能:

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 只需要一个值数组。但是如果我想返回函数呢?当前插件文档中没有示例。

4

1 回答 1

1

函数就是值

来回转换实际上并没有改变底层对象,而是暴露了不同的成员函数。在您的情况下,请改为声明

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

一些 v8 类层次结构信息

是的,argv是一个Value数组,但是,几乎所有东西(包括Function)都是 - 如下v8类图所示;这取自thlorenz.com,这是众多 v8 文档站点之一。

在此处输入图像描述

要求一个Value几乎是最不自以为是的声明,因为它假设最少,一个Function是一个Object并且Object是一个Value,因此一个Function可以出现在任何需要Value的地方,使用 Cast 也允许相反的方向,但底层对象必须是实际的东西。

例子

例如,以下是合法的

void someFunction(const Local<Function> &cb)
{
    Local<Value> v = cb;
    Local<Function> andBack = Local<Function>::Cast(v);
}
于 2015-06-10T01:45:54.820 回答