raf.js 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = wrapperRaf;
  6. let raf = callback => setTimeout(callback, 16);
  7. let caf = num => clearTimeout(num);
  8. if (typeof window !== 'undefined' && 'requestAnimationFrame' in window) {
  9. raf = callback => window.requestAnimationFrame(callback);
  10. caf = handle => window.cancelAnimationFrame(handle);
  11. }
  12. let rafUUID = 0;
  13. const rafIds = new Map();
  14. function cleanup(id) {
  15. rafIds.delete(id);
  16. }
  17. function wrapperRaf(callback) {
  18. let times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  19. rafUUID += 1;
  20. const id = rafUUID;
  21. function callRef(leftTimes) {
  22. if (leftTimes === 0) {
  23. // Clean up
  24. cleanup(id);
  25. // Trigger
  26. callback();
  27. } else {
  28. // Next raf
  29. const realId = raf(() => {
  30. callRef(leftTimes - 1);
  31. });
  32. // Bind real raf id
  33. rafIds.set(id, realId);
  34. }
  35. }
  36. callRef(times);
  37. return id;
  38. }
  39. wrapperRaf.cancel = id => {
  40. const realId = rafIds.get(id);
  41. cleanup(realId);
  42. return caf(realId);
  43. };