Promise专题

8/29/2022

#特点

  1. 有三种状态,分别为pendingfulfilledreject,其他操作无法改变
  2. 状态只能从pendingfulfilledreject

#优、缺点

优点:

  1. 以同步的流程表达出来,避免了回调函数的层层嵌套

缺点:

  1. 无法取消
  2. 内部抛出的错误无法反应到外部
  3. 处于pending状态无法知道处于哪一个状态

#注意点

  1. new Promise中如果没有使用resolvereject,那么promise的状态一直在pending
  2. catch存在跳过的现象
  3. 返回一个非Promise的值会被Promise.resolve包裹
  4. 不能返回自身否则会报错
  5. 传入非函数会发生值渗透
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

#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

#参考文章

Last Updated:5/25/2024, 2:23:06 AM