Хранить объект обработчика в PubSub? - PullRequest
0 голосов
/ 26 сентября 2019

Я пришел в 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 для обработчиков, не зависящих от параметров внешней функции?

...