【问题标题】:Calling callback from node.js native code从 node.js 本机代码调用回调
【发布时间】:2013-06-09 05:49:56
【问题描述】:

我正在使用 c++ 为 node.js 编写一个插件。

这里有一些sn-ps:

class Client : public node::ObjectWrap, public someObjectObserver {
public:
  void onAsyncMethodEnds() {
    Local<Value> argv[] = { Local<Value>::New(String::New("TheString")) };
    this->callback->Call(Context::GetCurrent()->Global(), 1, argv);
  }
....
private:
  static v8::Handle<v8::Value> BeInitiator(const v8::Arguments& args) {
    HandleScope scope;
    Client* client = ObjectWrap::Unwrap<Client>(args.This());

    client->someObject->asyncMethod(client, NULL);

    return scope.Close(Boolean::New(true));        
  }      

  static v8::Handle<v8::Value> SetCallback(const v8::Arguments& args) {
    HandleScope scope;
    Client* client = ObjectWrap::Unwrap<Client>(args.This());
    client->callback = Persistent<Function>::New(Handle<Function>::Cast(args[0]));

    return scope.Close(Boolean::New(true));
  }

我需要将一个 javascript 函数保存为回调,以便稍后调用它。 Client 类是另一个对象的观察者,应从 onAsyncMethodEnds 调用 javascript 回调。 不幸的是,当我调用函数“BeInitiator”时,我在回调 Call() 之前收到“总线错误:10”错误

感谢您的建议

【问题讨论】:

  • 你是在同一个线程中调用它吗?
  • No.. "asyncmethod" 启动一个新线程。这个方法是我链接的一个库的一部分,它使用talk_base/thread 来运行异步操作。

标签: c++ node.js callback native bus-error


【解决方案1】:

你不能从另一个线程-&gt;Call。 JavaScript 和 Node 是单线程的,试图从另一个线程调用一个函数相当于试图同时运行两个 JS 线程。

您应该重新编写代码以不这样做,或者您应该阅读libuv 的线程库。它提供了uv_async_send,可用于从单独的线程触发主JS循环中的回调。

这里有文档:http://nikhilm.github.io/uvbook/threads.html

【讨论】:

  • 我想这可以解决问题。不幸的是我不能使用 libuv.. 我会尝试使用 talk_base/thread 的 Send 方法来做同样的事情。非常感谢!
  • 为什么不能使用libuv
  • 我问只是因为如果您正在为 Node 编译,您应该可以自动访问它。
  • 因为线程是由我已链接到项目的外部库运行的。但是我发现 uv_send 和 uv_init 也在“非 libuv 线程”中工作。所以谢谢你。
  • 这是一个完整的例子blog.scottfrees.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2021-03-10
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多