NodeJS Addon从NAN AsyncWorker::Execute内部调用Javascript回调
NodeJS Addon calling Javascript callback from inside NAN AsyncWorker::Execute
我想从异步插件函数中调用nodejs回调。我看到了同步示例(此处)我使用了一个很棒的异步示例(这里)作为起点。
但是,当我尝试执行一个给c++AsyncWorker子类的回调时,我会遇到Segmentation错误。
这是我的代码:
#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)
我的问题:
- 我应该不使用Nan的AsyncWorker,而是自己滚动吗
- 如何设置Execute函数以调用Javascript
编辑:
参见此回购:
https://github.com/xavero/node_addon_sample
它有一个关于如何使用回调函数和从C land发出事件的示例。
您不应该在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}`))
相关文章:
- join() 失败,如果在线程内部调用 io_context.run()
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 从动态加载的 dll 内部调用C++函数
- 如何在JNI中从线程内部调用JAVA方法
- 编译在 Python 代码内部调用的 C++ 代码时出错,使用 Boost Python
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 在成员函数内部调用成员函数
- WM_DESTROY没有在包裹的WndProc内部调用
- 为什么要在JNI内部调用纤维在JVM中抛出堆叠量
- 为什么逗号运算符在运算符[]中打电话给操作员[],而不是在Operator()内部调用
- 在程序集文件内部调用C++函数
- 从Python函数内部调用C++函数
- 使用 Rcpp 从内部调用 R 的 optim 函数C++
- C++ 错误 LNK1120:在静态函数内部调用时有 1 个未解析的外部
- 在应用程序内部调用linux命令行工具
- 当您在设备内部调用cudaMalloc时,实际会发生什么
- 通过传递外部指针或内部调用 new 构造的类,我可以在销毁时天真地删除这个指针吗?
- 在模板成员函数内部调用非模板成员函数
- 如何正确地从运算符构造函数内部调用复制构造函数
- NodeJS Addon从NAN AsyncWorker::Execute内部调用Javascript回调