From 8d17d48aa0694979244e8eaef62ade47e19c6fc4 Mon Sep 17 00:00:00 2001 From: Scott Andrews Date: Thu, 30 Aug 2012 13:19:37 -0400 Subject: [PATCH] Allow when/delay to be externally resolved - returns a full deferred instead of a promise - clears the timeout when resolved/rejected --- delay.js | 14 ++++++++++---- test/delay.js | 12 ++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/delay.js b/delay.js index 201dd77e..da7504df 100644 --- a/delay.js +++ b/delay.js @@ -16,7 +16,7 @@ define(['./when'], function(when) { var undef; /** - * Creates a new promise that will resolve after a msec delay. If promise + * Creates a new deferred that will resolve after a msec delay. If promise * is supplied, the delay will start *after* the supplied promise is resolved. * * Usage: @@ -39,13 +39,19 @@ define(['./when'], function(when) { promise = undef; } - var deferred = when.defer(); + var deferred, timeout; - setTimeout(function() { + deferred = when.defer(); + timeout = setTimeout(function() { deferred.resolve(promise); }, msec); - return deferred.promise; + deferred.promise.always(function () { + clearTimeout(timeout); + timeout = undef; + }); + + return deferred; }; }); diff --git a/test/delay.js b/test/delay.js index e1e72fde..e16f3287 100644 --- a/test/delay.js +++ b/test/delay.js @@ -59,6 +59,18 @@ buster.testCase('when/delay', { assert.equals(val, 1); } ).always(done); + }, + + 'should clear timeout on reject': function(done) { + var d = delay(0); + d.reject(1); + + d.then( + fail, + function(val) { + assert.equals(val, 1); + } + ).always(done); } }); })(