SOURCE

// 全局对象pubsub,具备发布主题、订阅、取消订阅的功能
var pubsub = {};
 
(function(myObject) {
 
    // 存储广播主题
    var topics = {};
 
    // A topic identifier
    var subUid = -1;
 
    // Publish方法,传入主题名称,和主题需要传递的参数
    myObject.publish = function( topic, args ) {
 
        if ( !topics[topic] ) {
            return false;
        }
 
        // 某个主题下的订阅者列举、统计
        var subscribers = topics[topic],
            len = subscribers ? subscribers.length : 0;
 
        while (len--) {
            // 依次执行订阅者队列的订阅者的func方法
            subscribers[len].func( topic, args );
        }
 
        return this;
    };
 
    // Subscribe方法,用于往某个主题topic队列里添加订阅者, 每个订阅者会被保存为一个对象
    // 该对象包括一个uid和该订阅者自定义的函数
    // @return 返回token
    myObject.subscribe = function( topic, func ) {
 
        if (!topics[topic]) {
          // 检测某个主题是否存在
          // 不存在则新建空数组,用于存储观察者对象
            topics[topic] = [];
        }
 
        var token = ( ++subUid ).toString();
        topics[topic].push({
            token: token,
            func: func
        });
        return token;
    };
 
    // Unsubscribe,取消订阅,通过全局唯一的token,遍历所有主题,找到那个token,然后从主题的数组中删除
    myObject.unsubscribe = function( token ) {
        for ( var m in topics ) {
            if ( topics[m] ) {
                for ( var i = 0, j = topics[m].length; i < j; i++ ) {
                    if ( topics[m][i].token === token ) {
                        topics[m].splice( i, 1 );
                        return token;
                    }
                }
            }
        }
        return this;
    };
}( pubsub ));


getCurrentTime = function (){
 
   var date = new Date(),
         m = date.getMonth() + 1,
         d = date.getDate(),
         y = date.getFullYear(),
         t = date.toLocaleTimeString().toLowerCase();
 
        return (m + "/" + d + "/" + y + " " + t);
};
 
// 模拟 向网格里添加新数据行
function addGridRow( data ) {
 
   // ui.grid.addRow( data );
   console.log( "updated grid component with:" + data );
 
}
 
// 记录网格最后更新时间
function updateCounter( data ) {
 
   // ui.grid.updateLastChanged( getCurrentTime() );
   console.log( "data last updated at: " + getCurrentTime() + " with " + data);
 
}
 
// 统一处理,更新网格
gridUpdate = function( topic, data ){
 
  if ( data !== undefined ) {
     addGridRow( data );
     updateCounter( data );
   }
 
};

// 创建一个对"newDataAvailable"主题的订阅者
var subscriber = pubsub.subscribe( "newDataAvailable", gridUpdate );
 
// 下面代表着数据层的更新。通过ajax请求数据然后广播更新数据同样可用
 
// 发布新消息,通知观察者,观察者发生数据更新,网格增加一行
pubsub.publish( "newDataAvailable", {
  summary: "Apple made $5 billion",
  identifier: "APPL",
  stockPrice: 570.91
});
 
pubsub.publish( "newDataAvailable", {
  summary: "Microsoft made $20 million",
  identifier: "MSFT",
  stockPrice: 30.85
});


console 命令行工具 X clear

                    
>
console