gpt4 book ai didi

javascript - Node.js 插件中的回调函数

转载 作者:行者123 更新时间:2023-11-28 06:49:11 25 4
gpt4 key购买 nike

我在 node.js 扩展中包装了一个 CAN 总线管理器 API。一切正常,这将是最终结果:

// list interfaces
var interfaces = addon.listDevices();
console.log(interfaces);

// Allocating a new port
var port = new addon.CANPort();
port.setCallback(function(msg) {
// I would like to receive all CAN datagrams
console.log(msg);
});

// Connect to the 1st port
port.connect(0);
// Send a datagram
port.sendStruct(127508, 6, Array(0, 70, 5, 50, 0, 131, 114, 0));

除 setCallback 函数外,每个函数都可以。其实,我不知道该怎么办。我有一个这种类型的 C++ 回调:

void CANPort::SetReceiveCallback(functionCallback func);

它将在收到新数据报时调用该函数。

我在 http://nikhilm.github.io/uvbook/threads.html 中找到一些帮助,但我找不到与上一个示例相同的正确方法。我知道我应该使用 uv,但我不知道如何...

此外,我使用的是 Node.js 的 v0.11.14-pre,所以很多文档都已过时...

谢谢,尼古拉斯。

最佳答案

虽然这有点老了,但我使用了混合的 javascript/C++ 机制来集成外部回调。基本上在您的回调中调用 uv_queue_work() 并使用不执行任何操作的 uv_work_t ,并使用其 after_work_cb 调用您的 javascript 函数:

// C++

void nop() {}

void jscallback(uv_work_t* handle, int status)
{
// extract some_data from handle and call node::MakeCallback() here
// I make it call emit('event', some_data);
delete handle;
}

void called_by_third_party_callback(some_type some_data)
{
uv_work_t uv = new uv_work_t();
if (!uv) {
// error
}
// ensure some_data is accessible via uv->data
if (uv_queue_work(uv_default_loop(), uv, nop, jscallback) != 0) {
delete uv;
}
}

在我的 javascript 方面,我使用字符串到函数映射在我的 Engine 对象之上实现了一个简单的事件发射器机制:

// Javascript

exports.Engine.prototype.eventMap = [];
exports.Engine.prototype.on = function (name, func) {
if (typeof (func) === "function") {
this.eventMap[name] = func;
}

exports.Engine.prototype.emit = function (name, value) {
var func = this.eventMap[name];
if (typeof (func) === "function") {
func(value);
}
}

我是这样用的:

// Javascript

var obj = new require('myaddon').Engine();

obj.on('event', function (v) {
console.log('event: ' + v);
});

抱歉过度使用评论。我的代码过于复杂,无法显示为片段。

关于javascript - Node.js 插件中的回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24325822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com