UNPKG

2.13 kBJavaScriptView Raw
1"use strict";
2module.exports = function(Promise, INTERNAL) {
3var util = require("./util");
4var errorObj = util.errorObj;
5var isObject = util.isObject;
6
7function tryConvertToPromise(obj, context) {
8 if (isObject(obj)) {
9 if (obj instanceof Promise) return obj;
10 var then = getThen(obj);
11 if (then === errorObj) {
12 if (context) context._pushContext();
13 var ret = Promise.reject(then.e);
14 if (context) context._popContext();
15 return ret;
16 } else if (typeof then === "function") {
17 if (isAnyBluebirdPromise(obj)) {
18 var ret = new Promise(INTERNAL);
19 obj._then(
20 ret._fulfill,
21 ret._reject,
22 undefined,
23 ret,
24 null
25 );
26 return ret;
27 }
28 return doThenable(obj, then, context);
29 }
30 }
31 return obj;
32}
33
34function doGetThen(obj) {
35 return obj.then;
36}
37
38function getThen(obj) {
39 try {
40 return doGetThen(obj);
41 } catch (e) {
42 errorObj.e = e;
43 return errorObj;
44 }
45}
46
47var hasProp = {}.hasOwnProperty;
48function isAnyBluebirdPromise(obj) {
49 try {
50 return hasProp.call(obj, "_promise0");
51 } catch (e) {
52 return false;
53 }
54}
55
56function doThenable(x, then, context) {
57 var promise = new Promise(INTERNAL);
58 var ret = promise;
59 if (context) context._pushContext();
60 promise._captureStackTrace();
61 if (context) context._popContext();
62 var synchronous = true;
63 var result = util.tryCatch(then).call(x, resolve, reject);
64 synchronous = false;
65
66 if (promise && result === errorObj) {
67 promise._rejectCallback(result.e, true, true);
68 promise = null;
69 }
70
71 function resolve(value) {
72 if (!promise) return;
73 promise._resolveCallback(value);
74 promise = null;
75 }
76
77 function reject(reason) {
78 if (!promise) return;
79 promise._rejectCallback(reason, synchronous, true);
80 promise = null;
81 }
82 return ret;
83}
84
85return tryConvertToPromise;
86};