info-bus
Version:
It can be used to communicate in any project.
79 lines (75 loc) • 2.68 kB
JavaScript
;
var infoBus = {
events: {},
$emit: function $emit(name) {
// 触发事件
var taskArray = this.events[name];
if (taskArray instanceof Array) {
for (var _len = arguments.length, rest = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = taskArray[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var task = _step.value;
task.callback.apply(this, rest);
if (task.type === 'once') {
var index = taskArray.indexOf(task);
taskArray.splice(index, 1);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
},
$on: function $on(name, callback) {
// 注册事件
var taskArray = this.events[name];
if (taskArray === undefined) {
this.events[name] = [];
this.events[name].push({ type: 'on', callback: callback });
} else {
taskArray.push({ type: 'on', callback: callback });
}
},
$off: function $off(name, callback) {
// 注销事件
if (callback === undefined) {
this.events[name] = [];
return;
}
var taskArray = this.events[name];
if (taskArray instanceof Array) {
taskArray.map(function (task, index, array) {
if (task.callback === callback) {
array.splice(index, 1);
}
});
}
},
$once: function $once(name, callback) {
// 监听一次
var taskArray = this.events[name];
if (taskArray === undefined) {
this.events[name] = [];
this.events[name].push({ type: 'once', callback: callback });
} else {
taskArray.push({ type: 'once', callback: callback });
}
}
};
module.exports = infoBus;