-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLearnRecord.js
426 lines (317 loc) · 6.95 KB
/
LearnRecord.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
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
// 「over」下面的全部简单review一遍
// 「over」最下面的学习目标搞定
// 「over」自己重新全部实现一遍&提交代码,然后over
关键结果
1. 「over」所有的 then 收集的方法「always, catch」;顺带联想下fetch等支持promise的东西吧;
// over
2. 「over」两种执行方式「resolve, 接在promise暂停后执行」; 顺带联想下fetch等支持promise的东西吧;
// 感觉思考得差不多了,动手中,然后就思考下面的边界情况。
// 先动手 resolve;「over」
// 后动手接在 promise 后;「over」
// 思考下接在fetch后的情况;「over」
{
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
})
.then((res) => {
return res + 1
})
.then(() => {
})
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
})
.then((res) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(res + 1)
}, 1000)
})
})
.then((res) => {
console.log(res) // 2
})
fetch('xxxxx')
.then((res) => {
console.log(res)
})
}
3. 「over」边界情况的考虑;
- [over] resolver must be Function
- [over] 值的链式传递
- 「over」死循环
- 「over」防止多次启动;
- 「over」当 promise 的状态已经是改变的时候,.then时候的执行方式
- 「over」值的透传;
- 「over」promise.then 中的执行顺序;
- 「over」目前作者的实现并没有保证有error的时候,但是没有catch会将错误报出来「异步报错&可取消」;
// 值的链式传递
{
new Promise((resolve, reject) => {
setTimeout(() => {
reject(1)
})
})
.then(() => {
})
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
})
})
.catch(() => {
})
}
// 死循环
{
// 收集 over
// 不处理,实际执行 over
// 不处理,假想执行 over
// 处理方式 over
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 5000)
})
let a = promise.then(() => {
return a
})
a.catch(console.log)
}
// 防止多次启动
{
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
reject()
})
promise.then(() => {
console.log('then')
})
promise.catch(() => {
console.log('err')
})
}
// 当 promise 的状态已经是改变的时候,.then时候的执行方式
{
}
// 值的透传
{
}
// promise.then 中的执行顺序;
{
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('haha')
}, 5000)
})
promise.then(() => {
promise.then(() => {
console.log('2')
})
console.log('1')
})
// 1 2
}
// 目前作者的实现并没有保证有error的时候,但是没有catch会将错误报出来「异步报错&可取消」;
// 「over」所有再详细review一遍
// 「ing」粗略review一遍,然后over
// 思考下————
// 1. 「over」为什么要一直将错误往后传,直到有catch or 没有catch直接报错?
// 是这么设计的。
// 2. 「over」是如何往后传的?
// 3. 「over」如何判断已经到了最后面了?
// 将下面的「异步&可取消」思考明白就行了。
{
// 「over」当是 rejected & callbackQueue.length == 0 的时候,异步报错「因为下面的错误是捕获不到的」
// 1. 收集
// 2. 执行
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 5000)
})
.then(() => {
new Promise((resolve, reject) => {
reject(2)
})
})
.catch(() => {
console.log('err')
})
// 异步报错也不完全正确,应该是可取消
// - 「over」因为下面的 2 err 会被捕获「应该是被清除了异步报错」
// - 「over」下下面的 reject(1) 错误被捕获了
// 1. 收集
// 2. 执行
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
})
.then(() => {
return new Promise((resolve, reject) => {
reject(2)
})
})
.catch(() => {
console.log('err')
})
let p = new Promise((resolve, reject) => {
reject(1)
})
p.catch(() => {
console.log('err')
})
}
4. 「over」扩展;
- 「over」promise.resolve() or reject
- 「over」all
- 「over」race
- 「over」catch
- 「over」always
// Promise.resolve
Promise.resolve = function(value) {
if (value instanceof this) {
return value
}
return executeCallback.bind(new this())('resolve', value)
}
// Promise.reject
Promise.reject = function(value) {
if (value instanceof this) {
return value
}
return executeCallback.bind(new this())('reject', value)
}
// Promise.all
// 「over」下面的流程跑一通看看
// - 异常处理「两种」
// - 正常情况「两种」
// 正常情况如下;
// 还需要考虑错误处理情况。
// 「over」最后review一波思路,然后over
{
// 正常
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 5000)
})
Promise
.all([1, p])
.then((res) => {
console.log(res)
})
.catch(() => {
console.log('err')
})
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(1)
}, 2000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 3000)
})
Promise
.all([p1, p2])
.then((res) => {
console.log(res)
})
.catch(() => {
console.log('err')
})
// 异常1
promise = Promise.all()
// 异常2
Promise
.all([])
}
// Promise.race
// 「over」下面的流程跑一通
// 「over」review一波思路,然后over
{
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 2000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 3000)
})
Promise
.race([p1, p2])
.then((res) => {
console.log(res)
})
}
// Promise.prototype.catch & Promise.prototype.always
// 搞清收集的逻辑
// resolve执行一轮&reject执行一轮
// - catch
// 「over」收集
// 「over」执行
// - always
// 「over」收集
// 「over」执行
{
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 5000)
})
let p = new Promise((resolve, reject) => {
setTimeout(() => {
reject(1)
}, 5000)
})
p
.then(() => {
console.log('then')
})
.catch(() => {
console.log('err')
})
.then(() => {
console.log('then')
})
p
.then(() => {
console.log('then')
})
.always(() => {
console.log('always')
})
.then(() => {
console.log('then')
})
}
学习目标的话,就是把下面的想明白
{
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
})
.always(() => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 1000)
})
})
.then(() => {
})
.catch(() => {
})
}