-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.js
75 lines (62 loc) · 1.76 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const isArray = validateType('Array')
const isObject = validateType('Object')
const isFunction = validateType('Function')
function validateType(type) {
return function (source) {
return Object.prototype.toString.call(source) === `[object ${type}]`
}
}
function isPromise(source) {
return source && isObject(source) && isFunction(source.then)
}
function runResolvePromiseWithErrorCapture(promise, onFulfilledOrOnRejected, resolve, reject, valueOrReason) {
try {
resolvePromise(promise, onFulfilledOrOnRejected(valueOrReason), resolve, reject)
} catch (e) {
reject(e)
}
}
function resolvePromise(promise, x, resolve, reject) {
// Can not wait itself.
if (promise === x) {
return reject(new TypeError('Chaining cycle detected for promise #<Promise>'))
}
// Aviod calling repeatedly.
let called = false
if (x && (isObject(x) || isFunction(x))) {
try {
let then = x.then
if (isFunction(then)) {
then.call(
x,
y => {
if (called) return
called = true
resolvePromise(promise, y, resolve, reject)
},
r => {
if (called) return
called = true
reject(r)
}
)
} else {
resolve(x)
}
} catch (err) {
if (called) return
called = true
reject(err)
}
} else {
resolve(x)
}
}
module.exports = {
isArray,
isObject,
isPromise,
isFunction,
resolvePromise,
runResolvePromiseWithErrorCapture
}