Skip to content

Commit

Permalink
Promise delay extension
Browse files Browse the repository at this point in the history
  • Loading branch information
medikoo committed Oct 21, 2015
1 parent 282af76 commit cf0c9ec
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
38 changes: 38 additions & 0 deletions ext/promise/delay.js
@@ -0,0 +1,38 @@
// 'delay' - Promise extension
//
// promise.delay(timeout)
//
// Returns promise that resolves with same value but delayed in time

'use strict';

var nextTick = require('next-tick')
, ensureTimeout = require('timers-ext/valid-timeout')
, deferred = require('../../deferred');

deferred.extend('delay', function (/*timeout*/) {
var def, timeout = arguments[0];
if (timeout !== undefined) timeout = ensureTimeout(timeout);
if (!this.pending) this.pending = [];
def = deferred();
this.pending.push('delay', [timeout, def.resolve, def.reject]);
return def.promise;
}, function (timeout, resolve, reject) {
var delay;
if (this.failed) {
reject(this.value);
return;
}
if (timeout === undefined) delay = nextTick;
else delay = setTimeout;
delay(resolve.bind(null, this.value), timeout);
}, function (/*timeout*/) {
var def, timeout = arguments[0], delay;
if (timeout !== undefined) timeout = ensureTimeout(timeout);
if (this.failed) return this;
def = deferred();
if (timeout === undefined) delay = nextTick;
else delay = setTimeout;
delay(def.resolve.bind(def, this.value), timeout);
return def.promise;
});
1 change: 1 addition & 0 deletions index.js
Expand Up @@ -27,6 +27,7 @@ module.exports = assign(require('./deferred'), {
require('./ext/promise/aside');
require('./ext/promise/catch');
require('./ext/promise/cb');
require('./ext/promise/delay');
require('./ext/promise/finally');
require('./ext/promise/get');
require('./ext/promise/invoke');
Expand Down
14 changes: 14 additions & 0 deletions test/ext/promise/delay.js
@@ -0,0 +1,14 @@
'use strict';

var deferred = require('../../../deferred');

module.exports = function (a, d) {
var invoked = false, checked = false;
deferred(undefined).delay().done(function () {
a(checked, true);
invoked = true;
d();
}, d);
a(invoked, false);
checked = true;
};

0 comments on commit cf0c9ec

Please sign in to comment.