EdwardZZZ / articles

工作点滴记录
2 stars 0 forks source link

发布订阅 #34

Open EdwardZZZ opened 6 years ago

EdwardZZZ commented 6 years ago
const pubsub = (function() {
    const topics = {};
    let topicId = 0;

    return {
        publish(topic, ...props) {
            if (!topics[topic]) return;
            const subs = topics[topic];
            let len = subs.length;
            while (len--) {
                if (subs[len].callback) {
                    subs[len].callback( ...props);
                } else {
                    subs.splice(len, 1);
                }
            }
        },
        subscribe(topic, callback) {
            topics[topic] = topics[topic] ? topics[topic] : [];
            const token = ++topicId;
            topics[topic].push({ token, callback });
            return token;
        },
        unsubscribe(token) {
            for (let key in topics) {
                let topic = topics[key];
                if (!topic) continue;
                for (let i = 0, len = topic.length; i < len; i++) {
                    if (token === topic[i].token) {
                        topic.splice(i, 1);
                    }
                }
            }
        }
    };
})();