Skip to content

Instantly share code, notes, and snippets.

@antyakushev
Last active August 29, 2015 13:57
Show Gist options
  • Save antyakushev/40dfeef16b80bf9c461a to your computer and use it in GitHub Desktop.
Save antyakushev/40dfeef16b80bf9c461a to your computer and use it in GitHub Desktop.
var mediator = (function() {
var subscribe = function(channel, fn) {
if (!mediator.channels[channel]) mediator.channels[channel] = []; //создаёт массив, если его нету
mediator.channels[channel].push({ context: this, callback: fn }); //добавляет подписчика в массив
return this;
},
publish = function(channel) {
if (!mediator.channels[channel]) return false; //ничего не делает, если на такое сообщение никто не подписан
var args = Array.prototype.slice.call(arguments, 1); //arguments — объект, а не массив. таким вот образом он превращается в массив args, а заодно отсекается первый аргумент, который указан в объявлении функции явно — channel
for (var i = 0, l = mediator.channels[channel].length; i < l; i++) {
var subscription = mediator.channels[channel][i];
subscription.callback.apply(subscription.context, args); //а так мы вызываем функцию callback для массива аргументов
}
return this;
};
return { //возвращает объект
channels: {},
publish: publish,
subscribe: subscribe,
installTo: function(obj) {
obj.subscribe = subscribe;
obj.publish = publish;
}
};
}()); //паттерн «Модуль» http://largescalejs.ru/module-pattern/
//Pub/sub on a centralized mediator — обращаемся к медиатору напрямую
mediator.name = "tim";
mediator.subscribe('nameChange', function(arg) {
console.log(this.name);
this.name = arg;
console.log(this.name);
});
mediator.publish('nameChange', 'david'); //tim, david
//Pub/sub via third party mediator — добавляем в объект функции медиатора
var obj = {name: 'sam'};
mediator.installTo(obj);
obj.subscribe('nameChange', function(arg) {
console.log(this.name);
this.name = arg;
console.log(this.name);
});
obj.publish('nameChange', 'john'); //sam, john
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment