From 43c2d256f509eace7da66860b5b2af66ee6d3372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=93=E8=81=AA?= <469376974@qq.com> Date: Mon, 25 Mar 2019 16:45:57 +0800 Subject: [PATCH] finish commit --- Observable.js | 65 +++++++++++++++++++------------ PubSub.js | 29 ++++++++------ test/test.js | 105 +++++++++++++++++++++++++------------------------- 3 files changed, 110 insertions(+), 89 deletions(-) diff --git a/Observable.js b/Observable.js index 03545cd..ee7f224 100644 --- a/Observable.js +++ b/Observable.js @@ -6,33 +6,48 @@ */ class ObserverList { - constructor() { - this.observerList = []; - } - add(observer) { - // todo add observer to list - } - remove(observer) { - // todo remove observer from list - } - count() { - // return observer list size - } + constructor() { + this.observerList = []; + } + + add(observer) { + // todo add observer to list + this.observerList.push(observer) + } + + remove(observer) { + // todo remove observer from list + let index = this.observerList.findIndex(e => e === observer) + index !== -1 && this.observerList.splice(index, 1) + } + + count() { + // return observer list size + return this.observerList.length + } } class Subject { - constructor() { - this.observers = new ObserverList(); - } - addObserver(observer) { - // todo add observer - } - removeObserver(observer) { - // todo remove observer - } - notify(...args) { - // todo notify - } + constructor() { + this.observers = new ObserverList(); + } + + addObserver(observer) { + // todo add observer + this.observers.add(observer) + } + + removeObserver(observer) { + // todo remove observer + this.observers.remove(observer) + } + + notify(...args) { + // todo notify + for (let i = 0; i < this.observers.count(); i++) { + this.observers.observerList[i].update(...args) + } + } } -module.exports = { Subject }; \ No newline at end of file +module.exports = {Subject}; \ No newline at end of file diff --git a/PubSub.js b/PubSub.js index 0c7999e..df7d7da 100644 --- a/PubSub.js +++ b/PubSub.js @@ -7,20 +7,25 @@ module.exports = class PubSub { - constructor() { - this.subscribers = {}; - } + constructor() { + this.subscribers = {}; + } - subscribe(type, fn) { - // todo subscribe - } + subscribe(type, fn) { + // todo subscribe + this.subscribers[type] = fn + } - unsubscribe(type, fn) { - // todo unsubscribe - } + unsubscribe(type, fn) { + // todo unsubscribe + this.subscribers[type] = null + } - publish(type, ...args) { - // todo publish - } + publish(type, ...args) { + // todo publish + if (this.subscribers[type]) { + this.subscribers[type].call(this, ...args) + } + } } diff --git a/test/test.js b/test/test.js index aab05a3..2b69489 100644 --- a/test/test.js +++ b/test/test.js @@ -6,70 +6,71 @@ */ const assert = require('assert'); -const { PubSub, Observable } = require('..'); +const {PubSub, Observable} = require('..'); const random = () => Math.random() * 1e9 >> 0 || 1; describe('PubSub', () => { - let ob = new PubSub(); + let ob = new PubSub(); - it('subscribe -> publish', async () => { - let sum = 0; - let val = random(); - ob.subscribe('add', (val) => sum += val); - ob.publish('add', val); - assert.ok(sum === val); - }); + it('subscribe -> publish', async () => { + let sum = 0; + let val = random(); + ob.subscribe('add', (val) => sum += val); + ob.publish('add', val); + assert.ok(sum === val); + }); - it('subscribe -> publish -> unsubscribe -> publish', async () => { - let sum = 0; - let val = random(); - let add = (val) => sum += val; - ob.subscribe('add', add); - ob.publish('add', val); - assert.ok(sum === val); + it('subscribe -> publish -> unsubscribe -> publish', async () => { + let sum = 0; + let val = random(); + let add = (val) => sum += val; + ob.subscribe('add', add); + ob.publish('add', val); + assert.ok(sum === val); - sum = 0; - val = random(); - ob.unsubscribe('add', add); - ob.publish('add', val); - assert.ok(sum !== val); - }); + sum = 0; + val = random(); + ob.unsubscribe('add', add); + ob.publish('add', val); + assert.ok(sum !== val); + }); }); describe('Observable', () => { - class Observer { - constructor() { - this.sum = 0; - } - update(val) { - this.sum += val; + class Observer { + constructor() { + this.sum = 0; + } + + update(val) { + this.sum += val; + } } - } - it('addObserver -> notify', async () => { - let subject = new Observable.Subject(); - let ob = new Observer(); - subject.addObserver(ob); - assert.ok(subject.observers.count() === 1); - let val = random(); - subject.notify(val); - assert.ok(ob.sum === val); - }); + it('addObserver -> notify', async () => { + let subject = new Observable.Subject(); + let ob = new Observer(); + subject.addObserver(ob); + assert.ok(subject.observers.count() === 1); + let val = random(); + subject.notify(val); + assert.ok(ob.sum === val); + }); - it('addObserver -> notify -> removeObserver -> notify', async () => { - let subject = new Observable.Subject(); - let ob = new Observer(); - subject.addObserver(ob); - assert.ok(subject.observers.count() === 1); - let val = random(); - subject.notify(val); + it('addObserver -> notify -> removeObserver -> notify', async () => { + let subject = new Observable.Subject(); + let ob = new Observer(); + subject.addObserver(ob); + assert.ok(subject.observers.count() === 1); + let val = random(); + subject.notify(val); - ob.sum = 0; - val = random(); - subject.removeObserver(ob); - assert.ok(subject.observers.count() === 0); - subject.notify(val); - assert.ok(ob.sum !== val); - }); + ob.sum = 0; + val = random(); + subject.removeObserver(ob); + assert.ok(subject.observers.count() === 0); + subject.notify(val); + assert.ok(ob.sum !== val); + }); });