一款小巧的发布订阅

92 阅读1分钟

//2019-11-13

发布订阅

import {utils} from 'roi';
let descriptor = Object.create(null);
descriptor.subscribe = {};
let morse = {
    //发布
    publish(action){
        if(
            !utils.type(action,'object') || 
            !utils.type(action.type,'string') ||
            !utils.type(descriptor.subscribe[action.type],'array') ||
            !descriptor.subscribe[action.type].length
        ){ return }
        //遍历执行
        descriptor.subscribe[action.type].forEach(fn => {
            fn(action.payload);
        });
    },
    //订阅
    subscribe(action,fn){
        if(!utils.type(action,'string') || !utils.type(fn,'function')){ return }
        //判断是否有当前队列
        if(!utils.type(descriptor.subscribe[action],'array')){
            descriptor.subscribe[action] = [];
        };
        //判断添加fn
        if(descriptor.subscribe[action].indexOf(fn) < 0){
            descriptor.subscribe[action].push(fn);
        }
        //返回取消订阅
        return () => {
            this.unsubscribe(action,fn);
        }
    },
    //取消订阅
    unsubscribe(action,fn){
        if(
            !utils.type(action,'string') || 
            !utils.type(fn,'function') || 
            !utils.type(descriptor.subscribe[action],'array') ||
            !descriptor.subscribe[action].length
        ){ return }
        //清除订阅
        let index = descriptor.subscribe[action].indexOf(fn);
        descriptor.subscribe[action].splice(index,1);
    }
};

export default morse;