2 module.exports = function(Promise, INTERNAL, debug) {
3 var util = require("./util");
4 var TimeoutError = Promise.TimeoutError;
6 var afterTimeout = function (promise, message, parent) {
7 if (!promise.isPending()) return;
9 if (typeof message !== "string") {
10 if (message instanceof Error) {
13 err = new TimeoutError("operation timed out");
16 err = new TimeoutError(message);
18 util.markAsOriginatingFromRejection(err);
19 promise._attachExtraTrace(err);
21 if (debug.cancellation()) {
26 var afterValue = function(value) { return delay(+this).thenReturn(value); };
27 var delay = Promise.delay = function (ms, value) {
29 if (value !== undefined) {
30 ret = Promise.resolve(value)
31 ._then(afterValue, null, null, ms, undefined);
33 ret = new Promise(INTERNAL);
34 setTimeout(function() { ret._fulfill(); }, +ms);
36 ret._setAsyncGuaranteed();
40 Promise.prototype.delay = function (ms) {
41 return delay(ms, this);
44 function successClear(value) {
46 if (handle instanceof Number) handle = +handle;
51 function failureClear(reason) {
53 if (handle instanceof Number) handle = +handle;
59 Promise.prototype.timeout = function (ms, message) {
61 var parent = this.then();
62 var ret = parent.then();
63 var handle = setTimeout(function timeoutTimeout() {
64 afterTimeout(ret, message, parent);
66 if (debug.cancellation()) {
68 _resultCancelled: function() {
73 return ret._then(successClear, failureClear, undefined, handle, undefined);