取消订阅的事件-算法分析与设计---micheal t.goodrich roberto tamassia

8.6取消订阅的事件有时候,我们也许需要取消订阅事件的功能。比如小明突然不想买房子了,为了避免继续接收到售楼处推送过来的短信,小明需要取消之前订阅的事件。现在我们给event对象增加remove方法: event.remove = function( key, fn ){ var fns = this.clientList[ key ]; if ( !fns ){ //如果key对应的消息没有被人订阅,则直接返回return false; } if ( !fn ){ //如果没有传入具体的回调函数,表示需要取消key对应消息的所有订阅fns && ( fns.length = 0 ); }else{ for ( var l = fns.length - 1; l >=0; l-- ){ //反向遍历订阅的回调函数列表var _fn = fns[ l ]; if ( _fn === fn ){ fns.splice( l, 1 ); //删除订阅者的回调函数} } } }; var salesOffices = {}; var installEvent = function( obj ){ for ( var i in event ){ obj[ i ] = event[ i ]; } } installEvent( salesOffices ); salesOffices.listen( 'squareMeter88', fn1 = function( price ){ //小明订阅消息console.log( '价格= ' + price ); }); salesOffices.listen( 'squareMeter88', fn2 = function( price ){ //小红订阅消息console.log( '价格= ' + price ); }); salesOffices.remove( 'squareMeter88', fn1 ); //删除小明的订阅salesOffices.trigger( 'squareMeter88', 2000 ); //输出:2000 8.7真实的例子——网站登录通过售楼处的虚拟例子,我们对发布—订阅模式的概念和实现都已经熟悉了,那么现在就趁热打铁,看一个真实的项目。假如我们正在开发一个商城网站,网站里有header头部、nav导航、消息列表、购物车等模图灵社区会员轩辕专享尊重版权
pdf 文件大小:8.11MB