throttleByAnimationFrame.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = throttleByAnimationFrame;
  7. exports.throttleByAnimationFrameDecorator = throttleByAnimationFrameDecorator;
  8. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  9. var _raf = _interopRequireDefault(require("./raf"));
  10. function throttleByAnimationFrame(fn) {
  11. var requestId;
  12. var later = function later(args) {
  13. return function () {
  14. requestId = null;
  15. fn.apply(void 0, (0, _toConsumableArray2.default)(args));
  16. };
  17. };
  18. var throttled = function throttled() {
  19. if (requestId == null) {
  20. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  21. args[_key] = arguments[_key];
  22. }
  23. requestId = (0, _raf.default)(later(args));
  24. }
  25. };
  26. throttled.cancel = function () {
  27. return _raf.default.cancel(requestId);
  28. };
  29. return throttled;
  30. }
  31. function throttleByAnimationFrameDecorator() {
  32. // eslint-disable-next-line func-names
  33. return function (target, key, descriptor) {
  34. var fn = descriptor.value;
  35. var definingProperty = false;
  36. return {
  37. configurable: true,
  38. get: function get() {
  39. // eslint-disable-next-line no-prototype-builtins
  40. if (definingProperty || this === target.prototype || this.hasOwnProperty(key)) {
  41. return fn;
  42. }
  43. var boundFn = throttleByAnimationFrame(fn.bind(this));
  44. definingProperty = true;
  45. Object.defineProperty(this, key, {
  46. value: boundFn,
  47. configurable: true,
  48. writable: true
  49. });
  50. definingProperty = false;
  51. return boundFn;
  52. }
  53. };
  54. };
  55. }