分享,进步,自足

Curtion 发布的文章

13/5
2019

使用JS完成简单事件管理

之前在这篇文章写过,但是当时不理解。其实考察的是设计模式,发布订阅模式,理解后再手动写一次。
总结一下:维护一个对象,属性值为事件名称,值为一个数组,里面存的是所有订阅者的回调函数,emit事件时循环执行数组中的函数,同时查看函数的_once值是否为true,如果是在调用函数后取消监听这个事件。


// 类型: 校招
// 时长: 30 分钟
// 姓名:
// 日期:
// 实现下面的 EventEmitter 类, 用于简单的事件管理.
// 提示:
// 运行代码快捷键: Ctrl + S
class EventEmitter {
    constructor () {
        this.listener = {}
    }
    emit(type, ...args) {
        if (!this.listener.hasOwnProperty(type)) {
            return
        } else {
            this.listener[type].forEach(element => {
                element(...arg)
                if (element._once === true) {
                    this.off(type, element)
                }
            });
        }
    }
    once(type, listener) {
        listener._once = true
        if(!this.listener.hasOwnProperty(type)) {
            this.listener[type] = [listener]
        } else {
            this.listener[type].push(listener)
        }
    }
    on(type, listener) {
        if(!this.listener.hasOwnProperty(type)) {
            this.listener[type] = [listener]
        } else {
            this.listener[type].push(listener)
        }
    }
    off(type, listener) {
        const funcarr = this.listener[type]
        if(funcarr.indexOf(listener) !== -1) {
            funcarr.splice(funcarr.indexOf(listener), 1)
            if(funcarr.length === 0) {
                delete this.listener[type]
            }
        }
    }
}
// 在不修改下面代码的情况下, 能满足下面列举的使用
console.log('输出结果:');
const target = new EventEmitter();
// once
target.once('ready', id => console.log('ready', id));
target.emit('ready', 1);
target.emit('ready', 2);
const messageListener = (...args) => console.log(args);
// on
target.on('message', messageListener);
target.emit('message', 'hello');
target.emit('message', 'world', '!');
// off
target.off('message', messageListener);
target.emit('message', 'nothing');
// 输出结果参考
// 输出结果:
// ready 1
// hello
// world !
// (off 后无输出)

+ MORE

17/3
2019

毕业设计(二)<--文章发布、文章查询-->基于JavaScript的博客系统

完成功能

完成了文章发布的功能和文章查询的功能。实现过程比较简单,花了这么多时间主要都去解决这个问题去了:帖子链接

  • 剩下的时间重新规划了数据表;
  • 把token授权的部分单独提出出来以前的想法是错误的,不能提前在路由中判断,需要到指定的路由中判断
  • 优化了if--else语法,把else全部去掉了,提前到前面,一旦发现错误马上返回,这样就避免了多层的if嵌套。

已知的不足:明显没有用到面向对象的思想,大部分还是面向过程了,这可能是思想问题。ECMAScript新功能用的较少。
大致的框架已经完成,后续的功能需要加快速度,4月底有一次中期答辩,希望时间够。

一直有个问题,现在新出的ECMAScript标准到底是属于ES6的扩充,还是像ES2015(ES6)、ES2016(ES7)、ES2017(ES8)这类的命名。到底哪个是正确的...有这个疑问是因为阮一峰老师的《ES6标准入门》有这么一段话:ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,但是各大前端社区都直接称之为ESXXXX之类的额,都没有算进ES6的范畴中

+ MORE

13/3
2019

曾经天真的我以为,刷机怎么可能成砖

有点标题了,不过这次的确是和砖差不多了。
小米的手机,本来用的魔趣,但是国内软件的流氓程度那是人尽皆知的,在阻止运行、绿色守护和黑域都要么失效,要么收费的情况下,没有东西能压住这些流氓软件了。
最后我选择回归miui的怀抱,大不了xposed不用就是了,结果就是第三方re刷不了官方包,我就下了一个线刷包;官网线刷包下载太慢,就下载了一个第三方制作的包,打算先回去,然后再更新。。
结果再fastboot模式下卡住了,十几分钟没动,我就把线拔了。。
结果就是re进不去,fb也进不去,开机屏幕不亮,完全没有反应,连接电脑有一个9008端口。
于是我上网去搜索,下了各个版本的miflash版本软件,下了n个线刷包。。
都是各种报错,各种各样的,终于给我找着一个能用的,软件提示我没有权限,需要小米售后人员的账号登陆才能刷?
于是我换成老版本的刷机工具,老版本的包都是不行的。。
于是我想到了小米之家,在出门前我用地图查了地址,因为刚来实习的新地方找不到路,我还用笔画了一个地图。。
结果就是2公里的路程,我整整找了三个小时都没找到,最后到家详细一查才知道,地图上标的位置不在地面上,在某个广场的里面。。
因为要用手机,明天我还得上班,就只能找万能的淘宝了,问了好几家都是100,最后找到了一家60的,我含泪忍痛的给了钱。
最后卖家登陆了他的账号,伪装了电脑的硬件码,成功的给我恢复了。。
以前觉得小米手机能随便刷机才买的,我连特别喜欢的一个魅族手机因为这个原因都没买。。
谁知道最后是这个结果,居然要售后的账号登陆才能刷机,虽然这样可以保证被盗手机的安全
但是首先淘宝全是这个服务,不光可以绕过屏幕锁,还能绕过BL锁,账号锁,这个权限个人还没发申请,简直是垃圾,国外的小米论坛上都有人给个人授权这个权限,
下个手机先把小米排除了,除非他的价格真的非常吃香。。。哈哈哈

+ MORE

11/3
2019

2019-03-11 总结

  • openlayers 3的图标绘制
  • openlayers 3的绘制圆,并且与layui的滑块绑定
  • 全是openlayers 3的操作,其实没什么营养。。

对了,我用nodejs的mysql库链接MySQL,昨天都没有问题,今天啥也没有做;突然就报错了ER_ACCESS_DENIED_ERROR: Access denied for user 'user'@'xx.xx.xx.xx' (using password: YES)
尝试重新装过mysql库,尝试删除用户再新建都没有成功,使用相同的配置navicat都可以链接,真是谜一样的错误。

+ MORE

10/3
2019

2019-03-10总结--openlayers图标

周一公司有一个项目交付,今天去加班了....


做的还是openlayers地图操作,用的谷歌卫星地图。主要主要是做地图筛选功能,Source上面加矢量图,加文字,然后加载到Vector上,最后添加到map上即可显示,清除标注直接清除feature就行了,不能删除图层。
然后就是一堆数据操作,因为直接用的浏览器运行,创建类只能使用工厂方式之类的,由于写了很多其它代码了,就没有使用。如果这个项目有后续会考虑重构。


哪天找点书来看看,好久没看非技术类的书了

+ MORE