先发布,后订阅

var Event = (function() {
    var global = this,
        Event,
        _default = ‘default‘;
    Event = function() {
        var _listen,
            _trigger,
            _remove,
            _slice = Array.prototype.slice,
            _shift = Array.prototype.shift,
            _unshift = Array.prototype.unshift,
            namespaceCache = {},
            _create,
            find,
            each = function(ary, fn) {
                var ret;
                for (var i = 0, l = ary.length; i < l; i++) {
                    var n = ary[i];
                    ret = fn.call(n, i, n);
                }
                return ret;
            };
        _listen = function(key, fn, cache) {
            if (!cache[key]) {
                cache[key] = [];
            }
            cache[key].push(fn);
        };
        _remove = function(key, cache, fn) {
            if (cache[key]) {
                if (fn) {
                    for (var i = cache[key].length; i >= 0; i--) {
                        if (cache[key] === fn) {
                            cache[key].splice(i, 1);
                        }
                    }
                } else {
                    cache[key] = [];
                }
            }
        };
        _trigger = function() {
            var cache = _shift.call(arguments),
                key = _shift.call(arguments),
                args = arguments,
                _self = this,
                ret,
                stack = cache[key];

            if (!stack || !stack.length) {
                return;
            }
            return each(stack, function() {
                return this.apply(_self, args);
            });
        };

        _create = function(namespace) {
            namespace = namespace || _default;
            var cache = {},
                offlineStack = [],
                ret = {
                    listen: function(key, fn, last) {
                        if (offlineStack === null) {
                            return;
                        }
                        if (last === ‘last‘) {
                            offlineStack.length && (offlineStack.pop()());
                        } else {
                            each(offlineStack, function() {
                                this();
                            });
                        }
                        offlineStack = null;
                    },
                    one: function(key, fn, last) {
                        _remove(key, cache);
                        this.liten(key, fn, last);
                    },
                    remove: function(key, fn) {
                        _remove(key, cache, last);
                    },
                    trigger: function() {
                        var fn,
                            args,
                            _self = this;
                        _shift.call(arguments, cache);
                        args = arguments;
                        fn = function() {
                            return _trigger.apply(_self, args);
                        };
                        if (offlineStack) {
                            return offlineStack.push(fn);
                        }
                        return fn();
                    }
                };
            return namespace ?
                (namespaceCache[namespace] ? namespaceCache[namespace] :
                    namespaceCache[namespace] = ret) : ret;
        };
        return {
            create: _create,
            one: function(key, fn, last) {
                var event = this.create();
                event.one(key, fn, last);
            },
            remove: function(key, fn) {
                var event = this.create();
                event.remove(key, fn);
            },
            listen: function(key, fn, last) {
                var event = this.create();
                event.listen(key, fn, last);
            },
            trigger: function() {
                var event = this.create();
                event.trigger.apply(this, arguments);
            }
        };

    }();
    return Event;
})();

// 先发布后订阅

Event.trigger(‘click‘, 1);

Event.listen(‘click‘, function(a) {
    console.log(a);
});

// 使用命名空间
Event.create(‘namespace1‘).listen(‘click‘, function(a) {
    console.log(a);
});

Event.create(‘namespace1‘).trigger(‘click‘, 1);

Event.create(‘namespace2‘).listen(‘click‘, function(a) {
    console.log(a);
});

Event.create(‘namespace2‘).trigger(‘click‘, 2);

原文地址:https://www.cnblogs.com/tujw/p/10506762.html

时间: 2024-10-11 17:55:47

先发布,后订阅的相关文章

【JavaScript】让事件支持先发布后订阅

之前写过一个的事件管理器,就是普通的先订阅后发布模式.但实际场景中我们需要做到后订阅的也能收到发布的消息.比如我们关注微信公众号,还是能看到历史消息的.类似于qq离线消息,我先发给你,你登录了就能收到了.就是确保订阅该事件的方法都能被执行. var eventManger = { cached: {}, handlers: {}, //类型,绑定事件 addHandler: function (type, handler) { if (typeof handler !== "function&q

文成小盆友python-num12 Redis发布与订阅补充,python操作rabbitMQ

本篇主要内容: redis发布与订阅补充 python操作rabbitMQ 一,redis 发布与订阅补充 如下一个简单的监控模型,通过这个模式所有的收听者都能收听到一份数据. 用代码来实现一个redis的订阅者何消费者. 定义一个类: import redis class Redis_helper(): def __init__(self): self.__conn = redis.Redis(host='192.168.11.87') #创建一个连接 def pub(self, mes, c

自学总结redis第三部分(安全性、主从、哨兵、事物、持久化、发布与订阅、虚拟内存)

八.redis的安全性 因为redis速度相当快,所以在一台比较好的服务器下,一个外部用户在一秒内可以进行15W次的密码尝试,这意味着需要设定非常强大的密码来防止暴力破解. 可以通过设置密码以及登录redis方式来操作,具体参考 九.redis主从复制 9.1简介 1.Master可以拥有多个slave. 2.多个slave可以连接同一个master外,还可以连接到其他的slave. 3.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求. 4.提供系统的伸缩性

Part1.2 、RabbitMQ -- Publish/Subscribe 【发布和订阅】

python 目录 (一).交换 (Exchanges) -- 1.1 武sir 经典 Exchanges 案例展示. (二).临时队列( Temporary queues ) (三).绑定(Bindings) (四).汇总(Putting it all together) python系列之 RabbitMQ -- Publish/Subscribe [发布和订阅] >>前面的部分我们创建了一个工作队列(work queue). 设想是每个任务都能分发到一个 worker[queue],这一

Sql2008 r2 使用ftp 发布和订阅方式同步数据

Sql2008 r2使用发布和订阅方式同步数据 由于很多图片 本篇没有图片 详情可以进入下载页  http://download.csdn.net/download/yefighter/7603741 1:发布服务器:发布方 sql2008 r2 iis7.5 windows server 2008 请登入服务器进行操作 不要用sqlserver远程连接 必须开启sqlserver agent服务以及开机自动启动 右键属性 打开sqlserver 点击新建本地发布 第一次发布的时候 会提示创建发

SqlServer 禁止架构更改的复制中手动修复使在发布和订阅中分别增加字段同步

由于之前的需要,禁止了复制架构更改,以至在发布中添加一个字段,并不会同步到订阅中,而现在又在订阅中添加了一个同名字段,怎么使这发布和订阅的两个字段建立同步关系呢? 下面就测试更改:此次发布类型为事务复制的可更新订阅,其他类型的发布没有测试. 首先建立事务复制的可更新订阅,建立好之后. 在发布创建一张测试表: CREATE TABLE [dbo].[DemoTab]( [Guid] [uniqueidentifier] NOT NULL, [SID] [varbinary](85) NOT NUL

sqlserver2005发布与订阅配置步骤

1,新建发布 前提条件:第一要调通网络,在sqlserver configuration manager 中选择mssqlserver的协议把named pipes改为启用,第二要建立一个文件夹D:\backup并设置共享,everyone 有读写权限 具体步骤如下: 修改后点击复制里面的本地发布,点击右键,新建发布 点击下一步 点击下一步 选择第一选项点击下一步 第一次创建的时候需要选择快照的位置,这个位置每次创建发布的默认位置,可以把共享的文件夹给填进去,同时这个位置也可以改动,在创建发布后

Redis的高级应用-事务处理、持久化、发布与订阅消息、虚拟内存使用

三.事务处理 Redis的事务处理比较简单.只能保证client发起的事务中的命令可以连续的执行,而且不会插入其他的client命令,当一个client在连接中发出multi命令时,这个连接就进入一个事务的上下文,该连接后续的命令不会执行,而是存放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令.如果其中执行出现错去,执行正确的不会回滚,次不同于关系型数据库的事务.         回滚后age的值已经改变. 取消一个事务用discard,取消事务队列,数据全部回滚.

Redis源码解析:30发布和订阅

Redis的发布与订阅功能,由SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,以及PUBLISH等命令实现. 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道.当有客户端通过PUBLISH命令向某个频道发布消息时,频道的所有订阅者都会收到这条消息. 除了订阅具体的频道之外,客户端还可以通过执行PSUBSCRIBE命令订阅一个或多个频道模式.当有客户端通过PUBLISH命令向某个频道发布消息时,消息不仅会被发送给这个频道的所有订阅者,它还会发