javascript — функция обратного вызова в аддоне Node.js

Я обертываю API-интерфейс CAN Bus Manager в расширении node.js.
Все работает хорошо, это будет конечный результат:

// 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 некоторая помощь, но я не могу найти правильный способ сделать то же самое, что и в предыдущем примере. Я знаю, что должен использовать ультрафиолет, но я не знаю как …

Более того, я использую v0.11.14-pre Node.js, поэтому большая часть документации устарела …

Спасибо,
Николя.

0

Решение

Хотя это довольно старое, но я использовал гибридный механизм 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 я использовал отображение строки в функцию для реализации простого механизма Event Emitter поверх моего 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);
});

Извините за чрезмерное использование комментариев. Мой код слишком переплетен, чтобы отображаться в виде фрагментов кода.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector