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;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 |