raf.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. var wrapperRaf = 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(id);
  45. return caf(realId);
  46. };
  47. if (process.env.NODE_ENV !== 'production') {
  48. wrapperRaf.ids = function () {
  49. return rafIds;
  50. };
  51. }
  52. export default wrapperRaf;