编程语言
首页 > 编程语言> > 观察者模式问题 – JavaScript对象从父数组中删除自身?

观察者模式问题 – JavaScript对象从父数组中删除自身?

作者:互联网

我正在尝试编写一个遵循观察者模式的对象关系,其中观察者关心主体上发生的一组特定事件.

我不确定这是否是100%标准,但是我构建它的方式,这些事件对象是在观察者中定义的,具有在事件发生时将触发的自定义回调.当一个事件发生在主题上时,它会通过它的所有观察者,并查看谁正在观看此事件.如果它发现观察者正在观察此事件,则会触发观察者事件的回调.

由于我希望我的观察者能够灵活地添加和删除需要关注的事件,我需要让事件对象能够在运行它的回调后删除它自己…例如,如果我的观察者只想回复一次事件,然后不再监视它.

这似乎是一个很好的计划,但我知道JavaScript对象本身不能调用delete().

我只是很好奇,是否有其他人遇到过这个,并提出了一个有效的解决方案.

我唯一的想法是我可以将引用传递给父观察者对象,它的子事件,然后当回调发生时,我可以在父内部调用一个方法…类似于removeEvent(this)将事件本身传递给它功能.然后,removeEvent函数可以从它的事件数组中拼出事件.唯一复杂的问题是在数组中找到此事件对象的位置. (也对此提出建议,谢谢!).

在此先感谢您的帮助!

解决方法:

我以为我会回答你的问题,但我不是100%确定你是如何实现你的观察者模式的.也许在我的下面的代码段中有一些有用的东西.我假设观察是通过回调函数完成的,我没有假设该数据的格式,所以我使用的是字符串.
我的解决方案的关键是回调接收对Subject的引用(这在观察者模式中是常见的).此引用可用于从主题中分离回调.

var Subject = {
    observers: {},

    attach: function( eventType, fn ) {
        if( !this.observers[eventType] ) this.observers[eventType] = [];
        this.observers[eventType].push( fn );
    },

    detach: function( fn ) {
        var newObservers,
            eventType,
            i;
        for( eventType in this.observers ) {
            newObservers = [];
            for( i = 0; i < this.observers[eventType].length; i++ ) {
                if( this.observers[eventType][i] !== fn ) newObservers.push( this.observers[eventType][i] );
            }
            this.observers[eventType] = newObservers;
        }
    },

    notify: function( eventType, data ) {
        var i, observers = this.observers[eventType].slice(0);
        for( i = 0; i < observers.length; i++ ) {
            observers[i]( data, this );
        }
    },

    poke: function() {
        this.notify( 'testing', 'I got poked' );
    }

};

var Observer = {

    logEvent: function( data, subject ) {
        console.log( 'Every time: ' + data );
    },

    logEventOnce: function( data, subject ) {
        console.log( 'Just once: ' + data );
        /*
         * THE CRUX
         */
        subject.detach( arguments.callee );
    }
};

Subject.attach( 'testing', Observer.logEvent );
Subject.attach( 'testing', Observer.logEventOnce );

Subject.poke();
//Every time: I got poked
//Just once: I got poked

Subject.poke();
//Every time: I got poked

Subject.poke();
//Every time: I got poked

Subject.poke();
//Every time: I got poked

标签:javascript,object,arrays,parent,observer-pattern
来源: https://codeday.me/bug/20190531/1188265.html