先发布,后订阅

Posted tujw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了先发布,后订阅相关的知识,希望对你有一定的参考价值。

技术图片
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);
View Code

 

以上是关于先发布,后订阅的主要内容,如果未能解决你的问题,请参考以下文章

任何需要先取消订阅 RxJS()

javascript UV Index Monitor App订阅PubNub并显示UV索引值。博文的代码片段。在这里查看项目:https:// githu

c_cpp UV Index Indicator订阅PubNub并使用颜色显示UV索引值。博文的代码片段。在这里查看项目:https:/

Android App 在片段中创建 ListView 引用时关闭

如何取消订阅RxKotlin / RxJava中的Flowable?

Redis的发布订阅