zoukankan      html  css  js  c++  java
  • 用es6方式的写的订阅发布的模式

    //发布订阅模式
    class EventEmiter {
    constructor() {
    //维护一个对象
    this._events = {

    }
    }
    on(eventName, callback) {
    if (this._events[eventName]) {
    //如果有就放一个新的
    this._events[eventName].push(callback);
    } else {
    //如果没有就创建一个数组
    this._events[eventName] = [callback]
    }
    }
    emit(eventName, ...rest) {
    console.log(...rest + 'rest的写法')
    // alert(...rest)
    if (this._events[eventName]) { //循环一次执行
    this._events[eventName].forEach((item) => {
    item.apply(this, rest)
    });
    }
    }
    removeListener(eventName, callback) {
    alert(callback)
    if (this._events[eventName]) {
    //当前数组和传递过来的callback相等则移除掉
    this._events[eventName] =
    this._events[eventName].filter(item => item !== callback);
    }
    }
    once(eventName, callback) {
    function one() {
    //在one函数运行原来的函数,只有将one清空
    callback.apply(this, arguments);
    //先绑定 执行后再删除
    this.removeListener(eventName, one);
    }
    this.on(eventName, one);
    //此时emit触发会执行此函数,会给这个函数传递rest参数
    }
    }
    class Man extends EventEmiter { }
    let man = new Man()
    function findGirl() {
    console.log('找新的女朋友')
    }
    function saveMoney() {
    console.log('省钱')
    console.log('arguments' + JSON.stringify(arguments));
    }
    // man.once('失恋', findGirl);
    // man.on('失恋', findGirl) //失恋 ,绑定一个函数方法
    man.on('失恋', saveMoney)//失恋 ,绑定一个函数方法
    // man.removeListener('失恋', saveMoney); //移除一个函数方法
    man.emit('失恋', ['wewe', 'jjj']);
    // man.emit('失恋');
    // man.emit('失恋');
    //绑定一次,触发多次,也只执行一次。触发后一次将数组中的哪一项删除掉下次触发就不会执行
  • 相关阅读:
    GoLang之网络
    GoLang之方法与接口
    GoLang之基础
    Twemproxy 缓存代理服务器
    判断点是否在三角形内
    C++中const 的各种用法
    解决java web中safari浏览器下载后文件中文乱码问题
    Spring MVC如何测试Controller(使用springmvc mock测试)
    java生成指定范围的随机数
    itextpdf添加非自带字体(例如微软雅黑)
  • 原文地址:https://www.cnblogs.com/yayaxuping/p/10088612.html
Copyright © 2011-2022 走看看