我正在使用c ++为node.js编写附加组件。
这里有一些片段:
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()之前收到“ Bus error:10”错误
感谢建议
您不能->Call从另一个线程。JavaScript和Node是单线程的,尝试从另一个线程调用一个函数等于尝试一次运行JS的两个线程。
->Call
您应该重新编写代码以免这样做,或者应该阅读libuv的线程库。它提供了uv_async_send可用于从单独线程触发主JS循环中的回调的功能。
libuv
uv_async_send
这里有文档:http : //nikhilm.github.io/uvbook/threads.html