【问题标题】:How do I save a callback for later with node-addon-api?如何使用 node-addon-api 保存回调以供以后使用?
【发布时间】:2019-06-15 03:39:39
【问题描述】:

我希望我的 C 库能够多次调用 JS 函数。我使用 Nan 让它工作,但在将其转换为 N-API/node-addon-api 时遇到了麻烦。

我如何保存一个 JS 回调函数并在以后从 C 中调用它?

这是我使用 Nan 的内容:

Persistent<Function> r_log;
void sendLogMessageToJS(char* msg) {
    if (!r_log.IsEmpty()) {
        Isolate* isolate = Isolate::GetCurrent();
        Local<Function> func = Local<Function>::New(isolate, r_log);
        if (!func.IsEmpty()) {
        const unsigned argc = 1;
        Local<Value> argv[argc] = {
            String::NewFromUtf8(isolate, msg)
        };
        func->Call(Null(isolate), argc, argv);
        }
    }
}
NAN_METHOD(register_logger) {
    Isolate* isolate = info.GetIsolate();
    if (info[0]->IsFunction()) {
        Local<Function> func = Local<Function>::Cast(info[0]);
        Function * ptr = *func;
        r_log.Reset(isolate, func);
        myclibrary_register_logger(sendLogMessageToJS);
    } else {
        r_log.Reset();
    }
}

如何使用 node-addon-api 进行等效操作?我看到的所有示例都会立即调用回调或使用 AsyncWorker 以某种方式保存回调。我不知道 AsyncWorker 是如何做到的。

【问题讨论】:

  • 您说的是 C 库,所以我认为您的意思是使用 N-API,而不是其 C++ 包装器node-addon-api

标签: node.js node.js-addon n-api


【解决方案1】:

我从the node-addon-api maintainers 得到了答案,这导致我找到了这个解决方案:

FunctionReference r_log;
void emitLogInJS(char* msg) {
  if (r_log != nullptr) {
    const Env env = r_log.Env();
    const String message = String::New(env, msg);
    const std::vector<napi_value> args = {message}; 
    r_log.Call(args);
  } 
}
void register_logger(const CallbackInfo& info) {
  r_log = Persistent(info[0].As<Function>());
  myclibrary_register_logger(emitLogInJS);
}

【讨论】:

  • 从另一个线程执行r_log.Call(args) 时,# Fatal error in HandleScope::HandleScope / # Entering the V8 API without proper locking in place 不会为您崩溃?
  • @EugeneBeresovsky 我对 Node/N-API/C 不够熟悉,不知道我是否从不同的线程调用它。我没有在我的 C/C++ 代码或我的 JS 中明确地对线程做任何事情。所有对 emitLogInJS 的调用最初都是由对我的同步 C 代码的同步 JS 调用引起的。我不做任何异步操作。
  • 嗨@EugeneBeresovsk你能检查github.com/nodejs/node-addon-api/issues/947
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2020-09-15
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多