UNPKG

topic

Version:

轻量级事件同步收发管理

145 lines 4.97 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for(var i = 0; i < props.length; i++){ var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } // index.ts var when = function(deps) { return typeof deps === "boolean" ? deps : deps(); }; var aps = Array.prototype.slice; var counter = 0; var Topic = /*#__PURE__*/ function() { "use strict"; function _class() { _classCallCheck(this, _class); this.listeners = {}; this.origins = {}; this.keeps = []; } _createClass(_class, [ { key: "publish", value: function publish() { var name = arguments[0]; var args = aps.call(arguments, 1); var listeners = this.origins[name] = this.listeners[name]; if (!listeners || !listeners.length) { return; } for(var i = 0; i < listeners.length; ++i){ listeners[i].fn.apply(null, args); } this.origins[name] = void 0; } }, { key: "subscribeOnce", value: function subscribeOnce(name, fn) { var executed = false; var ref = {}; ref.token = this.subscribe(name, function() { fn.apply(null, arguments); if (ref.token) { ref.token.unsubscribe(); } else { executed = true; } }); if (executed) { ref.token.unsubscribe(); } return ref.token; } }, { key: "subscribe", value: function subscribe(name, fn) { var token = "Token_" + counter++; var listeners = this.listeners[name]; if (listeners) { var origin = this.origins[name]; if (origin && listeners === origin) { listeners = this.listeners[name] = listeners.slice(0); } } else { listeners = this.listeners[name] = []; } listeners.push({ token: token, fn: fn }); if (this.keeps.length) { var keeps = this.keeps.filter(function(item) { return item.name === name && when(item.shouldPublish); }); for(var i = 0; i < keeps.length; ++i){ fn.apply(null, keeps[i].args); } } return { unsubscribe: this.unsubscribe.bind(this, name, token) }; } }, { key: "keep", value: function keep() { var name = arguments[0]; var shouldPublish = arguments[1]; var args = aps.call(arguments, 2); var token = "Token_" + counter++; when(shouldPublish) && this.publish.apply(this, [ name ].concat(args)); this.keeps.push({ shouldPublish: shouldPublish, token: token, name: name, args: args }); return { release: this.release.bind(this, token) }; } }, { key: "unsubscribe", value: function unsubscribe(name, token) { var listeners = this.listeners[name]; if (!listeners || !listeners.length) { return; } this.listeners[name] = listeners.filter(function(item) { return item.token !== token; }); } }, { key: "release", value: function release(token) { this.keeps = this.keeps.filter(function(item) { return item.token !== token; }); } } ]); return _class; }(); var topic = new Topic(); export { Topic, topic }; //# sourceMappingURL=index.js.map