79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
/** @license MIT License (c) copyright 2010-2014 original author or authors */
|
|
/** @author Brian Cavalier */
|
|
/** @author John Hann */
|
|
|
|
(function(define) { 'use strict';
|
|
define(function(require) {
|
|
|
|
var env = require('../env');
|
|
var TimeoutError = require('../TimeoutError');
|
|
|
|
function setTimeout(f, ms, x, y) {
|
|
return env.setTimer(function() {
|
|
f(x, y, ms);
|
|
}, ms);
|
|
}
|
|
|
|
return function timed(Promise) {
|
|
/**
|
|
* Return a new promise whose fulfillment value is revealed only
|
|
* after ms milliseconds
|
|
* @param {number} ms milliseconds
|
|
* @returns {Promise}
|
|
*/
|
|
Promise.prototype.delay = function(ms) {
|
|
var p = this._beget();
|
|
this._handler.fold(handleDelay, ms, void 0, p._handler);
|
|
return p;
|
|
};
|
|
|
|
function handleDelay(ms, x, h) {
|
|
setTimeout(resolveDelay, ms, x, h);
|
|
}
|
|
|
|
function resolveDelay(x, h) {
|
|
h.resolve(x);
|
|
}
|
|
|
|
/**
|
|
* Return a new promise that rejects after ms milliseconds unless
|
|
* this promise fulfills earlier, in which case the returned promise
|
|
* fulfills with the same value.
|
|
* @param {number} ms milliseconds
|
|
* @param {Error|*=} reason optional rejection reason to use, defaults
|
|
* to a TimeoutError if not provided
|
|
* @returns {Promise}
|
|
*/
|
|
Promise.prototype.timeout = function(ms, reason) {
|
|
var p = this._beget();
|
|
var h = p._handler;
|
|
|
|
var t = setTimeout(onTimeout, ms, reason, p._handler);
|
|
|
|
this._handler.visit(h,
|
|
function onFulfill(x) {
|
|
env.clearTimer(t);
|
|
this.resolve(x); // this = h
|
|
},
|
|
function onReject(x) {
|
|
env.clearTimer(t);
|
|
this.reject(x); // this = h
|
|
},
|
|
h.notify);
|
|
|
|
return p;
|
|
};
|
|
|
|
function onTimeout(reason, h, ms) {
|
|
var e = typeof reason === 'undefined'
|
|
? new TimeoutError('timed out after ' + ms + 'ms')
|
|
: reason;
|
|
h.reject(e);
|
|
}
|
|
|
|
return Promise;
|
|
};
|
|
|
|
});
|
|
}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
|