/assets/js/mixjs/lib/event/wait.js

https://gitlab.com/shinvdu/nodePPT · JavaScript · 199 lines · 127 code · 21 blank · 51 comment · 21 complexity · 5440500663bd2de66f7e469cb8434fcb MD5 · raw file

  1. /**
  2. * 一个简单的事件流处理
  3. * 状态:稳定
  4. * 支持多投事件,支持异步回调处理
  5. * 使用示例:
  6. * var a = MixJS.event.wait();
  7. * a.on('a,b,c', function(a,b,c){
  8. * alert('success');
  9. * });
  10. * $.post(url,data, function(res){
  11. * a.fire('a', res);
  12. * });
  13. * $.get(url, function(json){
  14. * a.fire('b', json)
  15. * })
  16. * setTimeout(function(){
  17. * a.fire('c')
  18. * },1000);
  19. */
  20. MixJS.define('event/wait', function($) {
  21. var _emptyFn = function() {};
  22. var now = +new Date;
  23. function getUUid() {
  24. return 'Theo' + (now++);
  25. }
  26. // var _emptyArr = [];
  27. function Wait() {
  28. // 强制使用new操作符
  29. if(!(this instanceof Wait)) {
  30. return new Wait();
  31. }
  32. this.init();
  33. }
  34. Wait.prototype = {
  35. constructor: Wait,
  36. init:function(){
  37. this.list = {}; //evt=>uuid array
  38. this.cbMap = {}; //uuid=>callback
  39. this.uuid2Evts = {}; //uuid=>evt array
  40. this._cbMap = {}; //callback=>uuid
  41. },
  42. /**
  43. * 绑定事件
  44. * @param {Array} evts 事件数组
  45. * @param {Function} callback 回调函数
  46. * @param {Object} scope 函数作用域
  47. * @return {[type]} [description]
  48. */
  49. on: function(evts, callback, scope) {
  50. if(!$.isFunction(callback) || !evts) {
  51. //如果不是函数,或者evts为空,则直接返回
  52. //不抛出异常
  53. return this;
  54. }
  55. scope = scope || null; //回调作用域
  56. evts = $.isArray(evts) ? evts : evts.split(',');
  57. var uuid = getUUid();
  58. this.cbMap[uuid] = {
  59. fn: callback,
  60. scope: scope
  61. };
  62. this._cbMap[callback] = uuid;
  63. $.each(evts, function(e, i) {
  64. this.list[e] = this.list[e] || {
  65. handlers: [],
  66. //待处理的uuid
  67. data: '',
  68. state: 0
  69. };
  70. (this.uuid2Evts[uuid] = this.uuid2Evts[uuid] || []).push(e);
  71. this.list[e].handlers.push(uuid); //使用uuid记录
  72. }, this)
  73. return this;
  74. },
  75. _findCanCallbacks: function(arr) {
  76. var back = [];
  77. for(var i = 0, len = arr.length; i < len; i++) {
  78. var uuid = arr[i];
  79. var evts = this.uuid2Evts[uuid];
  80. var doit = true;
  81. var args = [];
  82. for(var j = 0, l = evts.length; j < l; j++) {
  83. var tmp = this.list[evts[j]];
  84. if(tmp.state === 0) {
  85. doit = false;
  86. break;
  87. }
  88. args.push(tmp.data);
  89. }
  90. if(doit) {
  91. this.cbMap[uuid].args = args;
  92. back.push(this.cbMap[uuid]);
  93. }
  94. }
  95. return back;
  96. },
  97. /**
  98. * 触发事件
  99. * @param {String} evt 事件类型
  100. * @param {[type]} data 事件数据
  101. * @return {[type]} this
  102. */
  103. fire: function(evt, data) {
  104. var list = this.list[evt];
  105. if(!list) {
  106. return this;
  107. }
  108. list.state = 1; //标注为可以fire
  109. list.data = data || '';
  110. var handlers = list.handlers;
  111. handlers = this._findCanCallbacks(handlers);
  112. while(handlers[0]) {
  113. var cb = handlers.shift();
  114. var scope = cb.scope;
  115. var args = cb.args;
  116. cb.fn.apply(scope, args)
  117. }
  118. return this;
  119. },
  120. /**
  121. * 移出绑定事件
  122. * @param {String} evt 事件名称
  123. * @param {Function} callback 回调函数
  124. * @return {[type]} [description]
  125. */
  126. un: function(evt, callback) {
  127. if($.isUndefined(evt) || !$.isFunction(callback)) {
  128. return this;
  129. }
  130. var list = this.list[evt];
  131. if(!list) {
  132. return this;
  133. }
  134. var uuid = this._cbMap[callback];
  135. var handlers = list.handlers;
  136. var len = handlers.length;
  137. while(len--) {
  138. if(uuid === handlers[len]) {
  139. handlers.splice(len, 1);
  140. break;
  141. }
  142. }
  143. delete this._cbMap[callback];
  144. return this;
  145. },
  146. /**
  147. * 移出所有事件,重新初始化
  148. * @return {[type]} [description]
  149. */
  150. removeAll:function(){
  151. this.destroy();
  152. this.init();
  153. },
  154. /**
  155. * 销毁!
  156. * @return {[type]} [description]
  157. */
  158. destroy: function() {
  159. destroy(this);
  160. }
  161. }
  162. function destroy(obj) {
  163. var selfFn = arguments.callee;
  164. for(var a in obj) {
  165. if(obj.hasOwnProperty(a)) {
  166. if($.isArray(obj[a])) {
  167. obj[a].length = 0;
  168. } else if(typeof obj[a] === 'object') {
  169. selfFn(obj[a]);
  170. }
  171. delete obj[a];
  172. }
  173. }
  174. }
  175. return function() {
  176. return new Wait;
  177. }
  178. })