NodeJS Аддон, вызывающий обратный вызов Javascript из NAN AsyncWorker :: Execute

Я хотел бы вызвать обратный вызов nodejs из моей асинхронной аддонной функции. Я видел синхронный пример (Вот)
и я использую замечательный асинхронный пример (Вот) в качестве стартовой базы.

Однако, когда я пытаюсь выполнить обратный вызов, который был дан дочернему классу 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. Разве я не должен использовать AsyncWorker от Nan и вместо этого бросать свой?
  2. Как настроить функцию Execute для вызова в Javascript?

2

Решение

РЕДАКТИРОВАТЬ:

Смотрите этот репо:

https://github.com/xavero/node_addon_sample

в нем есть пример того, как работать с функциями обратного вызова и отправлять события из C land.

Вы не должны вызывать функции v8 / Nan в вашем методе Execute ScriptWorker, иначе вы получите ошибки сегмента. Переопределите функцию 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}`))
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]