家政小程序
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

timer.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //时钟队列
  2. const timers = [];
  3. //时钟类型
  4. const TIMER_TYPE = {
  5. //超时时钟
  6. TIMEOUT: 1,
  7. //循环时钟
  8. INTERVAL: 2
  9. };
  10. var getCurrentRoute = () => {
  11. let pages = getCurrentPages();
  12. if (pages.length > 0) {
  13. return pages[pages.length - 1].__route__.split('?')[0];
  14. } else {
  15. return 'GLOBAL';
  16. }
  17. };
  18. //时钟统一处理器
  19. const timerHandler = {
  20. setTimeout(func, microSeconds, isKeep) {
  21. if (typeof func !== 'function') {
  22. throw {
  23. message: 'setTimeout第一个参数需要传入一个function'
  24. };
  25. }
  26. let ms = microSeconds || 0;
  27. let keep = isKeep === true ? true : false;
  28. let timer = setTimeout(func, ms);
  29. timers.push({
  30. //创建的时钟
  31. timer: timer,
  32. //是否要全局保留
  33. isKeep: keep,
  34. //时钟类型
  35. type: TIMER_TYPE.TIMEOUT,
  36. //在哪个页面上创建的定时器
  37. owner: getCurrentRoute()
  38. });
  39. return {
  40. //创建的时钟
  41. timer: timer,
  42. //是否要全局保留
  43. isKeep: keep,
  44. //时钟类型
  45. type: TIMER_TYPE.TIMEOUT,
  46. //在哪个页面上创建的定时器
  47. owner: getCurrentRoute()
  48. };
  49. },
  50. setInterval(func, microSeconds, isKeep) {
  51. if (typeof func !== 'function') {
  52. throw {
  53. message: 'setInterval第一个参数需要传入一个function'
  54. };
  55. }
  56. let ms = microSeconds || 0;
  57. let keep = isKeep === true ? true : false;
  58. let timer = setInterval(func, ms);
  59. timers.push({
  60. //创建的时钟
  61. timer: timer,
  62. //是否要全局保留
  63. isKeep: keep,
  64. //时钟类型
  65. type: TIMER_TYPE.INTERVAL,
  66. //在哪个页面上创建的定时器
  67. owner: getCurrentRoute()
  68. });
  69. console.log('timers : ', timers);
  70. return {
  71. //创建的时钟
  72. timer: timer,
  73. //是否要全局保留
  74. isKeep: keep,
  75. //时钟类型
  76. type: TIMER_TYPE.INTERVAL,
  77. //在哪个页面上创建的定时器
  78. owner: getCurrentRoute()
  79. };
  80. },
  81. clearTimers() {
  82. /***
  83. * 拷贝原有的时钟队列到临时队列中,并清空原有的时钟队列
  84. */
  85. let oldTimers = [];
  86. timers.forEach(timer => {
  87. oldTimers.push(timer);
  88. });
  89. timers.length = 0;
  90. /***
  91. * 遍历临时时钟队列,将不保存并且不是本页面创建的计时器清除掉
  92. */
  93. let currentPage = getCurrentRoute();
  94. let timer = oldTimers.shift();
  95. while (timer) {
  96. //1、计时器不需要保存;2、非本页面创建的计时器
  97. if (!timer.isKeep && currentPage != timer.owner) {
  98. this.clearTimer(timer);
  99. } else {
  100. //不清除的时钟重新保存起来
  101. timers.push(timer);
  102. }
  103. timer = oldTimers.shift();
  104. }
  105. },
  106. clearTimer(timer) {
  107. if (timer && timer.type) {
  108. switch (timer.type) {
  109. case TIMER_TYPE.TIMEOUT:
  110. clearTimeout(timer.timer);
  111. break;
  112. case TIMER_TYPE.INTERVAL:
  113. clearInterval(timer.timer);
  114. break;
  115. default:
  116. break;
  117. }
  118. }
  119. }
  120. };
  121. export default timerHandler;