Я использую излучатели событий в качестве примитивов синхронизации. Например, у меня есть один класс, который спрашивает семафор как структуру в Redis. Если семафор установлен, он испускает событие. Код указан ниже:Переписать событие эмиттера с реактивным программированием (пример семафора)
var redis = require("redis"),
async = require('async'),
client = redis.createClient(),
assert = require('assert'),
EventEmitter = require('events').EventEmitter;
util = require('util');
var isMaster = false,
SEMAPHORE_ADDRESS = 'semaphore';
var SemaphoreAsker = function() {
var self = this;
var lifeCycle = function (next) {
client.set([SEMAPHORE_ADDRESS, true, 'NX', 'EX', 5], function(err, val) {
console.log('client');
if(err !== null) { throw err; }
if(val === 'OK') {
self.emit('crown');
} else {
console.log('still a minion');
}
});
};
async.forever(
function(next) {
setTimeout(
lifeCycle.bind(null, next),
1000
);
}
);
};
util.inherits(SemaphoreAsker, EventEmitter);
(new SemaphoreAsker()).on('crown', function() {
console.log('I`m master');
});
Это работает, но выглядит немного тяжелым. Можно ли переписать пример с помощью BaconJS (RxJS/whateverRPlibrary)?
Прохладный вопрос. Я отправлю ответ RxJs для сравнения, когда вернусь домой сегодня вечером. Я думаю, что это немного короче, чем ответ отправленного бекона. – Brandon