通过事件发射调用JS函数
Calling a JS function by event emitting
我不确定如何在Node的主线程中通过在单独的c++线程中使用事件发射来调用Node/v8函数。如何在c++线程中发出事件?
在考虑NanAsyncWorker或uv_queue_work之前:我不想以异步方式调用c++函数。我想做完全相反的事情,通过发出事件从c++调用Javascript函数。
您不需要使用uv_queue_work
,但是LibUV的线程库的一部分是uv_async_*
方法,这是您在这种情况下理想的。当您初始化二级线程时,您还可以执行uv_async_init
来创建共享的async
数据结构。当其他线程发送消息时,该函数也会与回调一起调用。这个回调就是你调用JS代码来触发事件的地方。
下面是一些半伪代码的例子:
在你的线程初始化函数从JS调用一个单一的回调参数:
void ThreadInit(const v8::Arguments &args){
// This is just an example, this should be saved somewhere that
// some_callback will be able to access it.
v8::Persistent<v8::Function> js_callback = args[0].As<Function>();
// And save this where you'll be able to call uv_close on it.
uv_async_t async_data;
uv_async_init(uv_default_loop(), &async_data, some_callback);
// initialize the thread and pass it async_data
}
在线程:async_data.data = (void*) // Some data structure...
uv_async_send(&async_data);
在线程回调中:
void some_callback(uv_async_t *async_data){
// Note that this depending on the data, you could easily get thread-safety issues
// here, so keep in mind that you should follow standard processes here.
void* data = async_data->data;
// Process that data however you need to in order to create a JS value, e.g.
// Using NanNew because it is more readable than standard V8.
v8::Local<Number> count = NanNew<Number>(data.count);
v8::Local<v8::Value> argv[] = {
count
};
js_callback->Call(NanNull(), 1, argv);
}
相关文章:
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- 有没有类似的函数,比如 c++ 中的 JS Array.prototype.map?
- 从C++回调函数发出节点.js事件
- node.js Nan:在函数C++调用 JavaScript 回调
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- 从 JS (V8) 中C++对象的引用调用函数
- 如何使用 cocos creator 在 Cocos2d-X/Cocos2d-JS 中调用 javascript 函数并
- 从不同的节点插件方法多次调用JS函数
- 从节点addon多次调用JS函数
- QML:将JS对象传递给C++成员函数
- C ++ tiny-js 从外部文件执行 JavaScript 函数
- 从C 插件中调用QML中的JS函数
- Node.js插件类成员函数
- 如何存储对函数的引用,以便稍后可以在节点.js C++插件模块中回调它
- 在v8中,使用cpp对象作为参数执行js函数
- 在node.js 0.12.x中使用libuv函数
- 在使用NAN的Node.js的C++模块中未调用SetAccessor函数
- 我应该包装一个完全包含在node.js函数中的C++对象吗
- 从c++中反复调用node.js函数
- 通过事件发射调用JS函数