36 lines
		
	
	
		
			847 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			847 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var isFunction = require("../function/is-function");
 | |
| 
 | |
| module.exports = function (executor) {
 | |
| 	var Constructor;
 | |
| 	if (isFunction(this)) {
 | |
| 		Constructor = this;
 | |
| 	} else if (typeof Promise === "function") {
 | |
| 		Constructor = Promise;
 | |
| 	} else {
 | |
| 		throw new TypeError("Could not resolve Promise constuctor");
 | |
| 	}
 | |
| 
 | |
| 	var lazyThen;
 | |
| 	var promise = new Constructor(function (resolve, reject) {
 | |
| 		lazyThen = function (onSuccess, onFailure) {
 | |
| 			if (!hasOwnProperty.call(this, "then")) {
 | |
| 				// Sanity check
 | |
| 				throw new Error("Unexpected (inherited) lazy then invocation");
 | |
| 			}
 | |
| 
 | |
| 			try { executor(resolve, reject); }
 | |
| 			catch (reason) { reject(reason); }
 | |
| 			delete this.then;
 | |
| 			return this.then(onSuccess, onFailure);
 | |
| 		};
 | |
| 	});
 | |
| 
 | |
| 	return Object.defineProperty(promise, "then", {
 | |
| 		configurable: true,
 | |
| 		writable: true,
 | |
| 		value: lazyThen
 | |
| 	});
 | |
| };
 |