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.
		
		
		
		
		
			
		
			
				
					94 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					94 lines
				
				2.3 KiB
			| 
											3 years ago
										 | "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; | ||
|  | }; | ||
|  | 
 | ||
|  | }; |