Опубликовать / подписаться на уведомление после публикации - PullRequest
3 голосов
/ 26 июля 2011

Я пытаюсь понять шаблон проектирования Observable / Observer.

Это код, который у меня есть (код из книги Javascript Patterns):

            var publisher = {
            subscribers: {
                any: [] // event type: subscribers
            },
            publications: {
                any: []
            },
            subscribe: function (fn, type) {
                type = type || 'any';
                if (typeof this.subscribers[type] === "undefined") {
                    this.subscribers[type] = [];
                }

                this.subscribers[type].push(fn);

                if(typeof this.publications[type] === "undefined"){
                    return;
                }

                var pubs = this.publications[type],
                i,
                max = pubs.length

                for(i = 0;i<max;i++){
                    this.subscribers[type][i](pubs[i]);
                }

            },
            unsubscribe: function (fn, type) {
                this.visitSubscribers('unsubscribe', fn, type);
            },
            publish: function (publication, type) {
                var pubtype = type || 'any';
                this.visitSubscribers('publish', publication, type);
                if(typeof this.publications[pubtype] === "undefined") {
                    this.publications[pubtype] = [];
                }
                this.publications[pubtype].push(publication);
            },
            visitSubscribers: function (action, arg, type) {
                var pubtype = type || 'any',
                subscribers = this.subscribers[pubtype],
                i,
                max;

                if(typeof subscribers === 'undefined') {
                    return;
                }

                max = subscribers.length;

                for (i = 0; i < max; i += 1) {
                    if (action === 'publish') {
                        subscribers[i](arg);
                    } else {
                        if (subscribers[i] === arg) {
                            subscribers.splice(i, 1);
                        }
                    }
                }
            }
        };

        function makePublisher(o) {
            var i;
            for (i in publisher) {
                if (publisher.hasOwnProperty(i) && typeof publisher[i] === "function") {
                    o[i] = publisher[i];
                }
            }
            o.subscribers = {any: []};
            o.publications = {any: []};
        }

        var paper = {
            daily: function () {
                this.publish("big news today");
            },
            monthly: function () {
                this.publish("interesting analysis", "monthly");
            },
            yearly: function () {
                this.publish("every year","yearly");
            }
        };

        makePublisher(paper);

        var joe = {
            drinkCoffee: function (paper) {
                console.log('Just read ' + paper);
            },
            sundayPreNap: function (monthly) {
                console.log('About to fall asleep reading this ' + monthly);
            },
            onHolidays: function(yearly) {
                console.log('Holidays!'+yearly);
            }
        };


        paper.daily();
        paper.monthly();
        paper.yearly();

        paper.subscribe(joe.drinkCoffee);
        paper.subscribe(joe.onHolidays,'yearly');
        paper.subscribe(joe.sundayPreNap, 'monthly'); 

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

Должен ли я изменить publisher.subscribe и проверить, если не определено и если даопубликовать тип события?

Заранее спасибо.

* РЕДАКТИРОВАТЬ 1 *

Я добавил объект публикаций для сохранения публикаций вопубликовать функцию.Я также проверяю, есть ли подписчики для типа публикации, и если нет, я звоню return.Теперь мне нужно выяснить, как уведомить их о старшей публикации о подписке.

* РЕДАКТИРОВАТЬ 2 *

Добавлена ​​новая версия рабочего скрипта.Это правильно или лучший способ сделать это?

1 Ответ

1 голос
/ 26 июля 2011

Если вы хотите разрешить подписчикам получать уведомления после их отправки, вам нужно всего лишь

  1. Для каждого типа публикации сохраняйте список всех уведомлений, которые выполучить за это.(При публикации добавьте publication в соответствующий список)

  2. Измените функцию подписки, чтобы она также отправляла все соответствующие сохраненные уведомления поздно прибывающему подписчику.

    2.1 Возможно, вам также следует создать отдельный метод send_notification_to(arg, type, subscriber), чтобы избежать дублирования кода с помощью visitSubscribers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...