Я пришел в JS из C #, поэтому я использую синтаксис / архитектуру класса.
Мои функции-обработчики (которые я хочу сохранить в объекте Pub / Sub) работают с параметрами объекта (переданными в конструкторе), в которые они инкапсулированы.
Но они в настоящее времяхранится и вызывается как анонимная функция неопределенного объекта.
Итак, я пришел к выводу, что метод подписки PubSub требует объект, а затем связывает объект с обработчиком, используя handler.call(Object, args)
.Это позволяет моему объекту изменять свои параметры в ответ на какое-то событие.Может быть, лучше использовать шаблон Observer в этой ситуации?
class EventBus
{
constructor() {
this.subscribers = {};
}
subscribe(subName, object, handler) {
this.subscribers[subName].push({object: object, handler: handler});
}
publish(subName, eventArgs) {
const sub = this.subscribers[subName];
sub[0].handler.call(sub[0].object, (eventArgs));
}
}
Мой объект визуализации, функции которого я хочу вызвать, используя события:
class Renderer
{
constructor(tileSize)
{
this.tileSize = tileSize;
}
render(tile)
{
ctx.fillText(this.getTileGraphics(tile), tile.x*tileSize, tile.y*tileSize);
}
getTileGraphics(tile){...}
}
// и этомой HTML-код:
<script>
const eventBus = new EventBus();
var renderer = new Renderer(tileSize=32);
eventBus.subscribe("OnTileRender", renderer, renderer.render);
<script>
Так что мой подход в порядке, и я могу продолжить с этим, или лучше использовать Pub / Sub для обработчиков, не зависящих от параметров внешней функции?