🛫 Promise 的自定义封装

class Promise {
    // 构造方法
    constructor(executor) {
        // 添加属性
        this.PromiseState = 'pending'
        this.PromiseResult = null
        this.callbacks = []

        // 保存实例对象的this的值
        const self = this

        // resolve 函数
        function resolve(data) {
            // 判断状态
            if (self.PromiseState !== 'pending') return

            // 此时this为window
            // 改变对象状态(PromiseState)
            self.PromiseState = 'fulfilled'
            // 设置对象结果值(PromiseResult)
            self.PromiseResult = data

            // 调用成功的回调函数
            /*if (self.callback.onResolved) {
                self.callback.onResolved(data);
            }*/
            setTimeout(() => {
                self.callbacks.forEach(item => {
                    item.onResolved(data)
                })
            })
        }

        // reject 函数
        function reject(data) {
            // 判断状态
            if (self.PromiseState !== 'pending') return

            // 改变对象状态(PromiseState)
            self.PromiseState = 'rejected'
            // 设置对象结果值(PromiseResult)
            self.PromiseResult = data

            // 调用失败的回调函数
            /*if (self.callback.onRejected) {
                self.callback.onRejected(data);
            }*/

            setTimeout(() => {
                self.callbacks.forEach(item => {
                    item.onRejected(data)
                })
            })
        }

        try {
            // 同步调用执行器函数
            executor(resolve, reject)
        } catch (e) {
            // 修改对象状态为失败
            reject(e)
        }
    }

    then(onResolved, onRejected) {

        const self = this
        // 判断回调函数参数
        if (typeof onRejected !== 'function') {
            onRejected = reason => {
                throw reason;
            }
        }
        if (typeof onResolved !== 'function') {
            onResolved = value => value;
        }
        return new Promise((resolve, reject) => {
            // 封装函数
            function callback(type) {
                try {
                    // 获取回调函数的执行结果
                    let result = type(self.PromiseResult);
                    // 判断
                    if (result instanceof Promise) {
                        // 如果是 promise 类型的对象
                        result.then(v => {
                            resolve(v)
                        }, r => {
                            reject(r)
                        })
                    } else {
                        // 结果的对象状态为「成功」
                        resolve(result)
                    }
                } catch (e) {
                    reject(e)
                }
            }

            // 调用回调函数
            if (this.PromiseState === 'fulfilled') {
                setTimeout(() => {
                    callback(onResolved)
                })
            }

            if (this.PromiseState === 'rejected') {
                setTimeout(() => {
                    callback(onRejected)
                })
            }

            // pending的状态
            if (this.PromiseState === 'pending') {
                this.callbacks.push({
                    onResolved: function () {
                        callback(onResolved)
                    },
                    onRejected: function () {
                        callback(onRejected)
                    }
                })
            }


        })
    }

    catch(onRejected) {
        return this.then(undefined, onRejected)
    }

    static resolve(value) {
        return new Promise((resolve, reject) => {
            if (value instanceof Promise) {
                value.then(v => {
                    resolve(v)
                }, r => {
                    reject(r)
                })
            } else {
                resolve(value)
            }
        })
    }

    static reject(reason) {
        return new Promise((resolve, reject) => {
            reject(reason)
        })
    }

    static all(promises) {
        return new Promise((resolve, reject) => {
            // 声明变量
            let count = 0 // 计数
            let arr = [] // 接收成功结果
            // 遍历
            for (let i = 0; i < promises.length; i++) {
                promises[i].then(v => {
                    // 当n个promise对象都成功才 resolve
                    count++;
                    // 将当前promise对象成功的结果存入数组中
                    arr[i] = v
                    // 判断
                    if (count === promises.length) {
                        // 在count等于数组个数才改变状态
                        resolve(arr) // 修改状态
                    }
                }, r => {
                    reject(r) // 只要有一个失败就改为失败
                })
            }
        })
    }

    static race(promises) {
        return new Promise((resolve, reject) => {
            for (let i = 0; i < promises.length; i++) {
                promises[i].then(v => {
                    // 修改返回对象的状态为「成功」 谁先运行谁决定状态
                    resolve(v)
                }, r => {
                    reject(r)
                })
            }
        })
    }
}
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
📢 上次更新: 2022/09/02, 10:18:16