You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.3 KiB
93 lines
2.3 KiB
"use strict"; |
|
module.exports = function(Promise, INTERNAL, debug) { |
|
var util = require("./util"); |
|
var TimeoutError = Promise.TimeoutError; |
|
|
|
function HandleWrapper(handle) { |
|
this.handle = handle; |
|
} |
|
|
|
HandleWrapper.prototype._resultCancelled = function() { |
|
clearTimeout(this.handle); |
|
}; |
|
|
|
var afterValue = function(value) { return delay(+this).thenReturn(value); }; |
|
var delay = Promise.delay = function (ms, value) { |
|
var ret; |
|
var handle; |
|
if (value !== undefined) { |
|
ret = Promise.resolve(value) |
|
._then(afterValue, null, null, ms, undefined); |
|
if (debug.cancellation() && value instanceof Promise) { |
|
ret._setOnCancel(value); |
|
} |
|
} else { |
|
ret = new Promise(INTERNAL); |
|
handle = setTimeout(function() { ret._fulfill(); }, +ms); |
|
if (debug.cancellation()) { |
|
ret._setOnCancel(new HandleWrapper(handle)); |
|
} |
|
ret._captureStackTrace(); |
|
} |
|
ret._setAsyncGuaranteed(); |
|
return ret; |
|
}; |
|
|
|
Promise.prototype.delay = function (ms) { |
|
return delay(ms, this); |
|
}; |
|
|
|
var afterTimeout = function (promise, message, parent) { |
|
var err; |
|
if (typeof message !== "string") { |
|
if (message instanceof Error) { |
|
err = message; |
|
} else { |
|
err = new TimeoutError("operation timed out"); |
|
} |
|
} else { |
|
err = new TimeoutError(message); |
|
} |
|
util.markAsOriginatingFromRejection(err); |
|
promise._attachExtraTrace(err); |
|
promise._reject(err); |
|
|
|
if (parent != null) { |
|
parent.cancel(); |
|
} |
|
}; |
|
|
|
function successClear(value) { |
|
clearTimeout(this.handle); |
|
return value; |
|
} |
|
|
|
function failureClear(reason) { |
|
clearTimeout(this.handle); |
|
throw reason; |
|
} |
|
|
|
Promise.prototype.timeout = function (ms, message) { |
|
ms = +ms; |
|
var ret, parent; |
|
|
|
var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() { |
|
if (ret.isPending()) { |
|
afterTimeout(ret, message, parent); |
|
} |
|
}, ms)); |
|
|
|
if (debug.cancellation()) { |
|
parent = this.then(); |
|
ret = parent._then(successClear, failureClear, |
|
undefined, handleWrapper, undefined); |
|
ret._setOnCancel(handleWrapper); |
|
} else { |
|
ret = this._then(successClear, failureClear, |
|
undefined, handleWrapper, undefined); |
|
} |
|
|
|
return ret; |
|
}; |
|
|
|
};
|
|
|