87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"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;
 | 
						|
};
 |