一个简单消息中心,实现回调的扁平化

function Msg(name, data) {
        this.name = name;// 消息标识名称,不同的消息应该不同的名称
        this.data = data;// 消息携带的数据,格式不限制
    }
    function Listener(keys, callback) {
        if (typeof keys === "string") {
            this.keys = keys.split(‘-‘);
        } else {
            this.keys = keys;// 监听的消息关键字,也就是消息的唯一标识,keys的顺序不代表事件发生的顺序
        }
        this.callback = callback;// 当满足消息条件的时候,出发的回调
        this.msgs = {};// 因为需要监听多个消息,因此这里的会有一个队列,存储感兴趣的消息
    }
    // 匹配
    Listener.prototype.match = function(msg/* Msg */) {// 简单的名字相等规则
        var i = 0, len = this.keys.length;
        for (; i < len; i++) {
            if (this.keys[i] == msg.name) {// 中
                this.msgs[msg.name] = msg;
            }
        }
        this.fire();
    };
    Listener.prototype.fire = function() {
        var i = 0, len = this.keys.length, key;
        for (; i < len; i++) {
            key = this.keys[i];
            if (!this.msgs.hasOwnProperty(key)) {// 如果有这个属性,那么说明消息已经达到
                return false;
            }
        }
        // 调用callback
        var msgs = this.msgs;
        this.msgs = {};
        this.callback.call(undefined,msgs);
    };
    // 一个页面只需要一个消息中心(大型的单页应用也许不是很适合)
    // 消息中心用来匹配消息和函数回调
    function MsgCenter() {
        this.listeners = [];
    }
    MsgCenter.prototype.push = function(name, data) {
        var i = 0, len = this.listeners.length, msg = new Msg(name, data);
        for (; i < len; i++) {
            this.listeners[i].match(msg);
        }
    };
    MsgCenter.prototype.on = function(keys, callback) {
        this.listeners.push(new Listener(keys, callback));
    };
时间: 2024-10-12 14:17:02

一个简单消息中心,实现回调的扁平化的相关文章

扁平化设计的流行配色方案

扁平化设计的流行配色方案 扁平化设计从2012年开始就已经流行起来,我觉得flat design有点类似极简主义设计,同样是追求简洁.简约,不同的是,扁平化设计是一项运用简单效果,或者是刻意进行一个不使用三维效果的设计方案.一个好的扁平化设计必然不可能出现阴影.浮雕和渐变等效果. 扁平化设计看上去非常简单.直观,并且使用方便,所以在手机界面和网页设计中变得越来越受欢迎. 让我们来学习一下,如何进行扁平化设计吧. 什么是扁平化设计?<探讨扁平化设计之美><使用扁平化设计的网页设计欣赏>

对扁平化设计理念的认识与思考

现在的扁平化设计理念已经深入人心,但是什么是扁平化设计呢?恐怕是仁者见仁,智者见智.大家说法不一,因为不同的职位对扁平化的理解认知也是不一样的,但是真正的扁平化设计主要是基于以下三个维度来进行剖析的:第一,简约与高效.移动端的设计是基于微任务来设计的,微任务就是一个亟待解决.快速完成的任务,所以用户在使用的时候一定时间很短.效率很高,这样用户的体验才会很好.如果用户在很短的时间内无法完成任务,用户就会立马失去耐心,重新去换一个产品来解决问题.因此,扁平化的设计一定要界面布局简洁.用户操作高效.第

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

一个简单的回调(例子)

1.声明一个回调Interface: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... objects ); } 2.回调的地方继承回调,实现回调的方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe

计算机程序的思维逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持. 我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的.持久化的.跨程序的消息队列来演示内存映射文件的应用. 基本概念 所谓内存映射文件,就是将文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字节数组的操作,而字节数组的操作直接映射到文件上.这种映射可以是映射文件全部区域,也可以是只映射一部分区域.

Lua 下实现一个简单的消息队列

Lua 下实现一个简单的消息队列,如下简单的几条代码就可以了. local q1 = {} local q2 = {} -- 产生消息只需要 table.insert(q1, msg) -- 分发消息需要两层循环, 可以处理 dispatch 过程中产生的新消息 while q1[1] do q1,q2 = q2,q1 for i=1,#q2 do dispatch(q2[i]) q2[i] = nil end end

涨知识!从一个简单的消息服务,看云计算架构的真容

一转眼,云计算已经十年了.十年间,从AWS亚马逊云开始,涌现了Salesforce.微软.谷歌.IBM.VMware.阿里.腾讯.网易等一批云计算服务商,从互联网公司到传统IT巨头都卷入了这场云计算的时代大潮中.Gartner数据显示,2016 年全球公有云服务市场规模有望达2,086 亿美元,较2015年的1,780 亿美元市场规模增长17.2%. 然而,虽然十年过去了,公有云市场也将超过2000亿美元规模,但很多人依然不明白,到底什么是云计算?云计算的架构与传统IT架构到底有何区别?本文就以

利用Hessian10分钟配置出一个简单的跨Web服务消息推送

笔者,之前对Web跨服务推送数据一无所知,今天研究了一下.其实有些事物,在不理解的时候完全觉得好似天外来物.但了解一点点之后,又会觉得十分有趣.每天闲扯一下很开心,下面一个简单的实例10分钟配置出跨Web服务的消息推送.一.被调用端web.xml配置 <!--HelloHessian --> <servlet> <servlet-name>HelloHessian</servlet-name> <servlet-class>com.caucho.

基于python使用qqbot接入qq做一个简单的文字消息自动回复

qqbot是一个免费开源的基于smartqq的python插件,如果默认安装有pip,则可以直接在命令行下执行:pip install qqbot安装qqbot,安装成功后可以在命令行输入qqbot help查看帮助文档.如果直接输入qqbot会自动弹出一个二维码图片,用手机qq扫码即可启动成功,会自动保存本次的登陆信息到本地文件,下次可以输入qqbot -q qq号码启动,如果登陆信息没有过期就可以不用扫码登陆.qqbot启动后,可以再开一个终端来操作qqbot,输入:qq help|stop