gpt4 book ai didi

javascript - Node.js >= 0.12.* C++ 插件实例化返回回调

转载 作者:行者123 更新时间:2023-11-28 06:13:39 25 4
gpt4 key购买 nike

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

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);

}

Node 中的实现:

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

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

这会输出以下实现 Node :

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

最佳答案

函数就是值

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

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

一些 v8 类层次信息

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

enter image description here

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

例子

例如下面是合法的

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

关于javascript - Node.js >= 0.12.* C++ 插件实例化返回回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com