gpt4 book ai didi

c++ - NodeJS Addon 从 NAN AsyncWorker::Execute 内部调用 Javascript 回调

转载 作者:搜寻专家 更新时间:2023-11-01 00:22:52 24 4
gpt4 key购买 nike

我想从我的异步插件函数中调用一个 nodejs 回调。我看过同步示例 ( here )我正在使用一个很棒的异步示例 ( here) 作为起始基础。

但是,当我尝试执行提供给 c++ AsyncWorker 子类的回调时,出现了段错误。

这是我的代码:

#include <nan.h>
#include <functional>
#include <iostream>
#include <exception>
using namespace Nan;
using namespace v8;
using namespace std;

class ScriptWorker : public AsyncWorker {
public:
ScriptWorker(Callback *callback, const std::map<std::string, Callback*>)
: AsyncWorker(callback), script(script), cbs(cbs) {}

~ScriptWorker() {}

void Execute () {

// ------------------------
// Segmentation fault after
// ------------------------

Local<Value> argv[] = {
New<v8::Number>(id)
};

// -------------------------
// Segmentation fault before
// -------------------------

cbs["getUser"]->Call(1, argv);
}

private:
std::string script;
std::map<std::string, Callback*> cbs;
};

NAN_METHOD(Method) {
Local<Object> array = info[0]->ToObject();
Callback *callback = new Callback(info[1].As<Function>());

// Build up callbacks passed in from javascript.
// Will be a dynamic loop, but for now, hard code the one getUser example.
std::map<std::string, Callback*> cbs;
cbs.insert(std::pair<std::string, Callback*>("getUser",
new Callback(
array->Get(
v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), "getUser")
).As<Function>()
)
));
AsyncQueueWorker(new ScriptWorker(callback, cbs));
}

NAN_MODULE_INIT(Init) {
Nan::Set(target, Nan::New<String>("hello").ToLocalChecked(), Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked());
}

NODE_MODULE(hello, Init)

我的问题:

  1. 我不应该使用 Nan 的 AsyncWorker 而改用我自己的吗?
  2. 如何设置 Execute 函数以调用 Javascript?

最佳答案

编辑:

查看此 repo :

https://github.com/xavero/node_addon_sample

它有一个关于如何使用回调函数和从 C 土地发出事件的示例。

您不应在 ScriptWorker 的 Execute 方法中调用 v8/Nan 函数,否则会出现段错误。覆盖 HandleOKCallback 函数以使用 javascript 回调。

要从 javascript 调用,请在您的 C++ 插件中:

NAN_MODULE_INIT(Init) {
Nan::Set(target, Nan::New("myJsFunctionName").ToLocalChecked(),
Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked());
}

NODE_MODULE(anyNameHere, Init)

在你的 javascript 中:

// run "npm install bindings --save" in console first
var addon = require('bindings')('NativeExtension');

addon.myJsFunctionName({ foo: "bar"}, (arg1,arg2) => console.log(`${arg1} - ${arg2}`))

关于c++ - NodeJS Addon 从 NAN AsyncWorker::Execute 内部调用 Javascript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659166/

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