From faf62f6949ddd753c8f61ca5d259772fe8023825 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Tue, 3 Jan 2017 16:28:11 -0500 Subject: [PATCH] CRM-19829 - Add crmThrottle angular util --- ang/crmUtil.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/ang/crmUtil.js b/ang/crmUtil.js index 8cb6242689..c48b2cbc54 100644 --- a/ang/crmUtil.js +++ b/ang/crmUtil.js @@ -306,4 +306,44 @@ }; }); + // Run a given function. If it is already running, wait for it to finish before running again. + // If multiple requests are made before the first request finishes, all but the last will be ignored. + // This prevents overwhelming the server with redundant queries during e.g. an autocomplete search while the user types. + // Given function should return an angular promise. crmThrottle will deliver the contents when resolved. + angular.module('crmUtil').factory('crmThrottle', function($q) { + var pending = [], + executing = []; + return function(func) { + var deferred = $q.defer(); + + function checkResult(result, success) { + _.pull(executing, func); + if (_.includes(pending, func)) { + runNext(); + } else if (success) { + deferred.resolve(result); + } else { + deferred.reject(result); + } + } + + function runNext() { + executing.push(func); + _.pull(pending, func); + func().then(function(result) { + checkResult(result, true); + }, function(result) { + checkResult(result, false); + }); + } + + if (!_.includes(executing, func)) { + runNext(); + } else if (!_.includes(pending, func)) { + pending.push(func); + } + return deferred.promise; + }; + }); + })(angular, CRM.$, CRM._); -- 2.25.1