1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| class Subscribe { constructor(name = 'subscriber') { this.name = name this.id = 'id-' + Date.now() + Math.ceil(Math.random() * 10000) } listen( publisher, message, handler ) { this[message + "_handler"] = handler publisher && publisher.addListener(this, message) return this } unlisten(publisher, message) { publisher && publisher.removeListener(this, message) return this } }
class Publish { constructor(name = 'publisher') { this.messageMap = {} this.id = 'id-' + Date.now() + Math.ceil(Math.random() * 10000) this.name = name }
addListener(subscriber, message) { if (!subscriber || !message) return false
if (!this.messageMap[message]) { this.messageMap[message] = [] }
const existIndex = this.messageMap[message].findIndex(exitSubscriber => exitSubscriber.id === subscriber.id) if (existIndex === -1) { this.messageMap[message].push(subscriber) } else { this.messageMap[message][existIndex][message + "_handler"] = subscriber[message + "_handler"] } };
removeListener(subscriber, message) { if (!subscriber) return false
const messages = message ? [message] : Object.keys(this.messageMap)
messages.forEach(message => { const subscribers = this.messageMap[message];
if (!subscribers) return false;
let i = subscribers.length; while (i--) { if (subscribers[i].id === subscriber.id) { subscribers.splice(i, 1) } }
if (!subscribers.length) delete this.messageMap[message] }) };
publish(message, ...info) { const subscribers = this.messageMap[message]
if (!subscribers || !subscribers.length) return this
subscribers.forEach(subscriber => subscriber[message + "_handler"](...info))
return this };
};
const salesOffices = new Publish('salesOffices')
const customer1 = new Subscribe('customer1')
customer1.listen(salesOffices,'楼房77',function(price,squareMeter){ console.log('hi') console.log('价格='+price) console.log('squareMeter=' + squareMeter) })
salesOffices.publish('楼房77','88','20000')
|