raf.js 974 B

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