-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathpromise-4-call-chaining.js
82 lines (75 loc) · 1.61 KB
/
promise-4-call-chaining.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
76
77
78
79
80
81
82
/**
* Created by Capricorncd.
* https://github.com/capricorncd
* Date: 2020-06-07 13:41
*/
const PENDING = 'PENDING'
const FULFILLED = 'FULFILLED'
/**
* 链式调用的实现
*/
class ZxPromise {
callbacks = []
// state
state = PENDING
// cache result
value = null
constructor (fn) {
fn(this._resolveHandler.bind(this))
}
then (onFulfilled) {
return new ZxPromise(resolve => {
this._handle({
resolve,
onFulfilled
})
})
}
_handle ({ onFulfilled, resolve }) {
if (this.state === PENDING) {
this.callbacks.push({ onFulfilled, resolve })
return
}
if (!onFulfilled) {
resolve(this.value)
return
}
// 把函数onFulfilled返回的结果,传递给下一个then
resolve(onFulfilled(this.value))
}
_resolveHandler (value) {
// value 为ZxPromise
if (value instanceof ZxPromise) {
let then = value.then
if (typeof then === 'function') {
then.call(value, this._resolveHandler.bind(this))
return
}
}
// value 为普通值
this.state = FULFILLED
this.value = value
this.callbacks.forEach(fn => {
this._handle(fn)
})
}
}
new ZxPromise(resolve => {
console.log('instance')
resolve('test4')
}).then(res => {
console.log('then1', res)
return 'the text from then1 return'
}).then(res => {
console.log('then2', res)
return new ZxPromise(re => {
setTimeout(() => {
re('new ZxPromise instance')
}, 100)
})
}).then(res => {
console.log('then3', res)
return 'the text from then3 return'
}).then(res => {
console.log('then4', res)
})