refactors Discourse.debouncePromise

This commit is contained in:
Wojciech Zawistowski 2013-10-20 10:38:26 +02:00
parent aef4227073
commit 4c4a2f220e
2 changed files with 14 additions and 16 deletions

View file

@ -47,25 +47,20 @@ Discourse.debounce = function(func, wait) {
@param {Number} wait how long to wait
**/
Discourse.debouncePromise = function(func, wait) {
var timeout = null;
var args = null;
var context = null;
var self, args, promise;
var later = function() {
func.apply(self, args).then(function (funcResult) {
promise.resolve(funcResult);
});
};
return function() {
context = this;
var promise = Ember.Deferred.create();
self = this;
args = arguments;
promise = Ember.Deferred.create();
if (!timeout) {
timeout = Em.run.later(function () {
timeout = null;
func.apply(context, args).then(function (y) {
promise.resolve(y);
});
}, wait);
}
Ember.run.debounce(null, later, wait);
return promise;
};
};

View file

@ -49,14 +49,17 @@ test("executes only once, no matter how many times debounced function is called
originalAndCallbackFiredOnce("(second call was supressed)");
});
test("does not prolong the timeout when the debounced function is called for the second time during the timeout", function() {
test("prolongs the timeout when the debounced function is called for the second time during the timeout", function() {
debounced().then(callback);
clock.tick(50);
debounced().then(callback);
clock.tick(50);
originalAndCallbackFiredOnce("exactly at the end of the original timeout");
nothingFired("at the end of the original timeout");
clock.tick(50);
originalAndCallbackFiredOnce("exactly at the end of the prolonged timeout");
});
test("preserves last call's context and params when executing delayed function", function() {