簡體   English   中英

NodeJS插件從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)

我的問題:

  1. 我是否應該不使用Nan的AsyncWorker而是自己滾動?
  2. 如何設置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}`))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM