#特点
- 有三种状态,分别为
pending
、fulfilled
、reject
,其他操作无法改变 - 状态只能从
pending
到fulfilled
或reject
#优、缺点
优点:
- 以同步的流程表达出来,避免了回调函数的层层嵌套
缺点:
- 无法取消
- 内部抛出的错误无法反应到外部
- 处于
pending
状态无法知道处于哪一个状态
#注意点
- 在
new Promise
中如果没有使用resolve
或reject
,那么promise的状态一直在pending
catch
存在跳过的现象- 返回一个非Promise的值会被
Promise.resolve
包裹 - 不能返回自身否则会报错
- 传入非函数会发生值渗透
Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log) // 1
1
#手写Promise相关方法
#Promise.all
if (!Promise.all) {
Promise.all = (arr: unknown[]) => {
return new Promise((resolve, reject) => {
const result: Promise<unknown>[] = []
const getResult = (index: number, value) => {
result[index] = value
if (result.length === arr.length) {
resolve(result)
}
}
for (let i = 0; i < arr.length; i++) {
Promise.resolve(arr[i]).then((value) => {
getResult(i, value)
}, reject)
}
})
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#Promise.race
if (!Promise.race1) {
Promise.race1 = (arr: Promise<unknown>[]) => {
return new Promise((resolve, reject) => {
for (let i = 0; i < arr.length; i++) {
Promise.resolve(arr[i]).then(resolve, reject)
}
})
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9