Promise

Youky ... 2021-10-11 前端
  • JS
About 2 min

# Promise

# 基本概念

  • Promise共有三种可能的状态,一个Promise只能出现两种:初始化状态、成功状态、失败状态。状态只能改变一次
  • Promise构造函数中的代码为同步代码,回调函数为微任务

# Promise为什么能解决回调地狱

# 回调地狱主要代表两个问题

  1. 多层嵌套
  2. 每个任务的处理结果存在两种可能性,在每种任务结束后都要分别处理这两种情况

# Promise的解决方法

  • 返回值穿透:在回调函数中返回Promise,可以实现链式调用(解决多层嵌套问题
  • 错误冒泡:前面产生的错误会一直向后传递,被catch接收到(解决重复处理两种情况的问题

# 为什么Promise的回调是微任务

如果不引入微任务,则回调中的异步任务会加入宏任务队列,也就是所有宏任务的末尾,这会导致回调函数间隔很长时间才能执行。

理想情况应该是添加到当前宏任务的后面,因此引入了微任务。

# then和catch的位置关系

new Promise((resolve, reject) => {
    reject(1)
}).catch(() => {
    console.log('catch')
}).then(() => console.log('then'))
// 输出:catch then
1
2
3
4
5
6
new Promise((resolve, reject) => {
    reject(1)
}).then(() => console.log('then'))
.catch(() => {
    console.log('catch')
})
// 输出:catch
1
2
3
4
5
6
7

原因:thencatch执行后都会返回一个promise,所以这两个方法都可以链式调用。

catch中只要没有显示抛出错误,其返回的promise都是成功状态。

# 其他API

# Promise.resolve

接收一个参数value,返回一个resolved状态的promise实例,value会作为其成功回调函数的参数。

# Promise.reject

接收一个参数reason,返回一个rejected状态的promise实例,reason会作为其失败回调函数的参数

# Promise.all

  • 接收一个元素为Promise(若不是,使用Promise.resolve进行转换)的数组。返回也是一个Promise
  • 全部变为成功状态,执行then回调,接收参数为一个数组,即各个Promise元素提供的value。
  • 只要有一个失败,则立即停止Promise.all的执行,并执行catch回调,接收reject提供的reason。

# Promise.race

  • 接收一组promise,但只获取第一个执行完毕的实例的状态
Last update: November 27, 2021 21:16
Contributors: youky7