9159金沙游艺场-奥门金沙游艺场-[欢迎您]

9159金沙游艺场为您呈现最新的面貌!,目前注册送体验金,欢迎您将成为影视娱乐行业新的风向标,是亚洲的优质娱乐先锋。

js观察者模式发布9159金沙游艺场

日期:2020-01-04编辑作者:前端

js观察者模式发布/订阅

以前在写页面的时候,从没这么多异步操作,只有在使用'setInterval'和'XMLHttpRequest'时了解了一下异步编程。这次在学习node的过程中,把异步回掉算是弄清楚了。但是在编码书写代码的时候,陷入了回调金字塔(callback hell)。使用es6Promise解决了一些问题。也看到了EventProxy模块基于事件驱动的解决方案。

 

在使用EventProxy的过程中,有种似曾相识的感觉。有点像观察者模式发布/订阅。首先使用数组缓存订阅者订阅的消息,当订阅者订阅消息的时候,把订阅的消息push到指定消息的队列中,当发布者发布消息的时候,我们遍历执行push到指定消息队列中的回调事件。

9159金沙游艺场, 

而订阅者不需要关心发布者什么时候发布消息。

而发布者不需要关心订阅者订阅的状态。

 

var observer = new Observe();
var callback = function(num) {
    console.log("event:"+num); // 输出event:2
};
// 订阅消息
observer.listen("event1", callback);
observer.listen("event2", callback);
// 移除订阅消息1
observer.remove('event1', callback);
// 发布者发布消息
observer.trigger("event1",1);
observer.trigger("event2",2);
具体代码如下:

function Observe() {
    // 缓存订阅者的消息队列
    this._list = [];
}
/**
 *
 * 订阅者订阅消息
 * @param  {string}   key 消息名
 * @param  {Function} fn  回调事件
 * @return {Null}       
 */
Observe.prototype.listen = function(key, fn) {
    if (!this._list[key]) {
        this._list[key] = [];
    }
    // 订阅消息,添加到缓存列表中
    this._list[key].push(fn);
};
/**
 * 
 * 移除订阅的消息
 * @param  {string}   key 消息名
 * @param  {Function} fn  回掉事件
 * @return {Null}       
 */
Observe.prototype.remove = function(key, fn) {
    // 获取当前key下的消息记录
    var arrFn = this._list[key];
    if (!arrFn) return false;
    // 未指定fn则删除当前key下所有的订阅消息
    if (!fn) {
        arrFn.length = 0;
    } else {
        for (var i = 0; i < arrFn.length; i++) {
            if (fn === arrFn[i]) {
                arrFn.splice(i,1);
            }
        }
    }
};
/**
 * 发布者发布消息
 * @param  {string} key 消息名
 * @param  {string | Object} 消息数据
 * @return {Null}  
 */
Observe.prototype.trigger = function(key, aa) {
    // 得到key,第二个及以上的参数
    var key = Array.prototype.shift.call(arguments);
    var args = arguments;
    var arrFn = this._list[key];
    if (!arrFn || arrFn.length === 0) {
        return;
    }
    // 遍历执行当前key下面的所有消息
    for (var i = 0; i < arrFn.length; i++) {
        arrFn[i].apply(this, args);
    }
};

 

以前在写页面的时候,从没这么多异步操作,只有在使用setInterval和XMLHttpRequest时了解了一下异步编程。这次在学习...

本文由9159金沙游艺场-奥门金沙游艺场-[欢迎您]发布于前端,转载请注明出处:js观察者模式发布9159金沙游艺场

关键词:

CentOS开启sudo权限

CentOS开启sudo权限 用惯了Ubuntu,在实践一些限令的时候sudo,然后在CentOS上也会习贯性的去sudo,而CentOS默许没张开sud...

详细>>

js实现的动画导航菜单效果代码

js达成的卡通片导航菜单效能代码,js完结动画导航菜单 本文实例叙述了js实现的卡通导航菜单作用代码。分享给大家...

详细>>

Python静态检查工具

Python静态检查工具 Python是一门动态语言。在给python传参数的时候并没有严格的类型限制。写python程序的时候,发现错...

详细>>

python异步socket编程之一【9159金沙游艺场】

python异步socket编程之一 异步网络能极大地提高程序的并行处理能力,所以写了一个专题来总结python中的异步通信。 一...

详细>>