raf.js 1.1 KB

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