【问题标题】:How do I store a reference to a function so I can call it back later in a node.js C++ addon module?如何存储对函数的引用,以便稍后在 node.js C++ 插件模块中调用它?
【发布时间】:2014-03-07 04:09:54
【问题描述】:

这是我用 C++ 编写并使用 node-gyp 构建的 node.js 插件模块。 当 StoreFunction 我试图存储一个指向函数的指针以便以后可以使用它

当我稍后在 InvokeFunction 中尝试调用它时,我得到了分段错误。如果我检查了两个函数中的指针(使用 cout)它们是相同的值,这让我感到困惑。

所以我猜测调用两个函数之间调用上下文的变化或者我不明白我指的是什么。

所有(ummmmmm)指针都非常感谢我的问题在这里.......

#include <node.h>
#include <v8.h>

using namespace v8;
v8::Persistent<v8::Function> callbackFunction;
 Handle<Value> StoreFunction(const Arguments& args) {
    HandleScope scope;
    callbackFunction = *Local<Function>::Cast(args[0]);
    return scope.Close(Undefined());
}

Handle<Value> InvokeFunction(const Arguments& args) {
    HandleScope scope;
    Local<Value> argv[1] = { String::New("Callback from InvokeFunction")};
    callbackFunction->Call(Context::GetCurrent()->Global(), 1, argv);
    return scope.Close(Undefined());
}

void init(Handle<Object> target) {
  NODE_SET_METHOD(target, "StoreFunction", StoreFunction);
  NODE_SET_METHOD(target, "InvokeFunction", InvokeFunction);
}

NODE_MODULE(someaddonmodule, init);

当然还有一些调用js............

var myaddon = require('../build/Release/someaddonmodule');
myaddon.StoreFunction(function(data){   
    console.log("Called back: "+data);
});

myaddon.InvokeFunction();   //causes a segmentation fault

【问题讨论】:

    标签: c++ node.js v8 embedded-v8 libuv


    【解决方案1】:

    答案是因为我们不再使用 Java 编程 Toto。 我创建的指针指向本地句柄,而不是函数。持有对 this 的“引用”不足以阻止 V8 垃圾收集在作用域关闭时销毁它。

    为了处理这个问题,需要向 V8 发出明确的请求,以留出一些内存来保存 这样做的功能:

    Persistent< Function > percy;
    Local<Function> callbackFunction = Local<Function>::Cast(args[0]);
    percy = Persistent<Function>::New(callbackFunction);
    

    如果对 V8 内部原理有更深入了解的人知道的不止这些,我仍然很想听听您的解释 :)

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 2019-12-16
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多