1. 程式人生 > >發布與訂閱模式

發布與訂閱模式

shift 發布 trigger fun this price 類型 con console

/*第一階段*/
var salesOffices = {}; // 定義售樓處
salesOffices.clientList = []; // 緩存列表,存放訂閱者的回調函數
salesOffices.listen = function(fn) { // 增加訂閱者
this.clientList.push(fn); // 訂閱的消息添加進緩存列表
};
salesOffices.trigger = function() { // 發布消息
for (var i = 0, fn; fn = this.clientList[i++];) {
fn.apply(this, arguments); // (2) // arguments 是發布消息時帶上的參數
}
};
salesOffices.listen(function(price, squareMeter) { // 小明訂閱消息
console.log(‘價格= ‘ + price);
console.log(‘squareMeter= ‘ + squareMeter);
});
salesOffices.listen(function(price, squareMeter) { // 小紅訂閱消息
console.log(‘價格= ‘ + price);
console.log(‘squareMeter= ‘ + squareMeter);
});
salesOffices.trigger(2000000, 88); // 輸出:200 萬,88 平方米
salesOffices.trigger(3000000, 110); // 輸出:300 萬,110 平方米


/*第二階段*/
var salesOffices = {}; // 定義售樓處
salesOffices.clientList = {}; // 緩存列表,存放訂閱者的回調函數
salesOffices.listen = function(key, fn) {
if (!this.clientList[key]) { // 如果還沒有訂閱過此類消息,給該類消息創建一個緩存列表
this.clientList[key] = [];
}
this.clientList[key].push(fn); // 訂閱的消息添加進消息緩存列表
};
salesOffices.trigger = function() { // 發布消息
var key = Array.prototype.shift.call(arguments), // 取出消息類型
fns = this.clientList[key]; // 取出該消息對應的回調函數集合
if (!fns || fns.length === 0) { // 如果沒有訂閱該消息,則返回
return false;
}
for (var i = 0, fn; fn = fns[i++];) {
fn.apply(this, arguments); // (2) // arguments 是發布消息時附送的參數
}
};
salesOffices.listen(‘squareMeter88‘, function(price) { // 小明訂閱 88 平方米房子的消息
console.log(‘價格= ‘ + price); // 輸出: 2000000
});
salesOffices.listen(‘squareMeter110‘, function(price) { // 小紅訂閱 110 平方米房子的消息
console.log(‘價格= ‘ + price); // 輸出: 3000000
});
salesOffices.trigger(‘squareMeter88‘, 2000000); // 發布 88 平方米房子的價格
salesOffices.trigger(‘squareMeter110‘, 3000000); // 發布 110 平方米房子的價格

發布與訂閱模式