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