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.
		
		
		
		
		
			
		
			
				
					
					
						
							86 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							86 lines
						
					
					
						
							2.1 KiB
						
					
					
				
								"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;
							 | 
						|
								};
							 | 
						|
								
							 |