UNPKG

debounce-promise

Version:

Create a debounced version of a promise returning function

73 lines (57 loc) 1.96 kB
'use strict'; /* global setTimeout, clearTimeout */ module.exports = function debounce(fn) { var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var lastCallAt = void 0; var deferred = void 0; var timer = void 0; var pendingArgs = []; return function debounced() { var currentWait = getWait(wait); var currentTime = new Date().getTime(); var isCold = !lastCallAt || currentTime - lastCallAt > currentWait; lastCallAt = currentTime; for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } if (isCold && options.leading) { return options.accumulate ? Promise.resolve(fn.call(this, [args])).then(function (result) { return result[0]; }) : Promise.resolve(fn.call.apply(fn, [this].concat(args))); } if (deferred) { clearTimeout(timer); } else { deferred = defer(); } pendingArgs.push(args); timer = setTimeout(flush.bind(this), currentWait); if (options.accumulate) { var argsIndex = pendingArgs.length - 1; return deferred.promise.then(function (results) { return results[argsIndex]; }); } return deferred.promise; }; function flush() { var thisDeferred = deferred; clearTimeout(timer); Promise.resolve(options.accumulate ? fn.call(this, pendingArgs) : fn.apply(this, pendingArgs[pendingArgs.length - 1])).then(thisDeferred.resolve, thisDeferred.reject); pendingArgs = []; deferred = null; } }; function getWait(wait) { return typeof wait === 'function' ? wait() : wait; } function defer() { var deferred = {}; deferred.promise = new Promise(function (resolve, reject) { deferred.resolve = resolve; deferred.reject = reject; }); return deferred; } //# sourceMappingURL=index.js.map