Spaces:
Runtime error
Runtime error
; | |
var customError = require("es5-ext/error/custom") | |
, isValue = require("es5-ext/object/is-value") | |
, ensurePromise = require("es5-ext/object/ensure-promise") | |
, nextTick = require("next-tick") | |
, ensureTimeout = require("../valid-timeout"); | |
module.exports = function (/* timeout */) { | |
ensurePromise(this); | |
var timeout = arguments[0]; | |
if (isValue(timeout)) timeout = ensureTimeout(timeout); | |
return new this.constructor( | |
function (resolve, reject) { | |
var isSettled = false, timeoutId; | |
var timeoutCallback = function () { | |
if (isSettled) return; | |
reject( | |
customError( | |
"Operation timeout (exceeded " + | |
(isValue(timeout) ? timeout + "ms" : "tick") + | |
")", | |
"PROMISE_TIMEOUT" | |
) | |
); | |
}; | |
if (isValue(timeout)) timeoutId = setTimeout(timeoutCallback, timeout); | |
else nextTick(timeoutCallback); | |
this.then( | |
function (value) { | |
isSettled = true; | |
clearTimeout(timeoutId); | |
resolve(value); | |
}, | |
function (reason) { | |
isSettled = true; | |
clearTimeout(timeoutId); | |
reject(reason); | |
} | |
); | |
}.bind(this) | |
); | |
}; | |