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.
		
		
		
		
		
			
		
			
				
					87 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					87 lines
				
				2.1 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | module.exports = function(Promise, INTERNAL) { | ||
|  | var util = require("./util"); | ||
|  | var errorObj = util.errorObj; | ||
|  | var isObject = util.isObject; | ||
|  | 
 | ||
|  | function tryConvertToPromise(obj, context) { | ||
|  |     if (isObject(obj)) { | ||
|  |         if (obj instanceof Promise) return obj; | ||
|  |         var then = getThen(obj); | ||
|  |         if (then === errorObj) { | ||
|  |             if (context) context._pushContext(); | ||
|  |             var ret = Promise.reject(then.e); | ||
|  |             if (context) context._popContext(); | ||
|  |             return ret; | ||
|  |         } else if (typeof then === "function") { | ||
|  |             if (isAnyBluebirdPromise(obj)) { | ||
|  |                 var ret = new Promise(INTERNAL); | ||
|  |                 obj._then( | ||
|  |                     ret._fulfill, | ||
|  |                     ret._reject, | ||
|  |                     undefined, | ||
|  |                     ret, | ||
|  |                     null | ||
|  |                 ); | ||
|  |                 return ret; | ||
|  |             } | ||
|  |             return doThenable(obj, then, context); | ||
|  |         } | ||
|  |     } | ||
|  |     return obj; | ||
|  | } | ||
|  | 
 | ||
|  | function doGetThen(obj) { | ||
|  |     return obj.then; | ||
|  | } | ||
|  | 
 | ||
|  | function getThen(obj) { | ||
|  |     try { | ||
|  |         return doGetThen(obj); | ||
|  |     } catch (e) { | ||
|  |         errorObj.e = e; | ||
|  |         return errorObj; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | var hasProp = {}.hasOwnProperty; | ||
|  | function isAnyBluebirdPromise(obj) { | ||
|  |     try { | ||
|  |         return hasProp.call(obj, "_promise0"); | ||
|  |     } catch (e) { | ||
|  |         return false; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | function doThenable(x, then, context) { | ||
|  |     var promise = new Promise(INTERNAL); | ||
|  |     var ret = promise; | ||
|  |     if (context) context._pushContext(); | ||
|  |     promise._captureStackTrace(); | ||
|  |     if (context) context._popContext(); | ||
|  |     var synchronous = true; | ||
|  |     var result = util.tryCatch(then).call(x, resolve, reject); | ||
|  |     synchronous = false; | ||
|  | 
 | ||
|  |     if (promise && result === errorObj) { | ||
|  |         promise._rejectCallback(result.e, true, true); | ||
|  |         promise = null; | ||
|  |     } | ||
|  | 
 | ||
|  |     function resolve(value) { | ||
|  |         if (!promise) return; | ||
|  |         promise._resolveCallback(value); | ||
|  |         promise = null; | ||
|  |     } | ||
|  | 
 | ||
|  |     function reject(reason) { | ||
|  |         if (!promise) return; | ||
|  |         promise._rejectCallback(reason, synchronous, true); | ||
|  |         promise = null; | ||
|  |     } | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | return tryConvertToPromise; | ||
|  | }; |