Promise 的一些注意点,以及梳理

前言

昨天面试去 xiaoman, 提到了 promise; 面对不断深入发问, 我脑子一片空白, 然后就想到了白云山; 我想怎么思考其他问题的时候没有这么思维活跃;

常用方法


Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
Promise.all() // 必须所有都 resolved
Promise.race() // 只要有一个 resolved
Promise.allSettled() // 所有都结束,不管是 resolved 还是 rejected
Promise.any() // 只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。 与 race 只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。
Promise.resolve()
Promise.reject()
Promise.try()

Promise 状态的不可逆性

Promise 状态的一旦变成 resolved 或 rejected 时,Promise 的状态和值就固定下来了,不论你后续再怎么调用 resolve 或 reject 方法,都不能改变它的状态和值。


var p1 = new Promise(function (resolve, reject) {
  resolve('success1')
  resolve('success2')
})

var p2 = new Promise(function (resolve, reject) {
  resolve('success')
  reject('reject')
})

p1.then(function (value) {
  console.log(value)
})

p2.then(function (value) {
  console.log(value)
})
// "success1"
// "success"

resolve 或 reject 后面的代码会不会执行

当然会

then 的第二个参数和 catch

catch相当于then(null,function(err){ /*处理错误*/})的写法


// 写法一
new Promise((resolve) => {
  foo.bar()
}).then(
  (res) => {
    console.log(res)
  },
  (err) => {
    console.log(err)
  }
)
// ReferenceError: foo is not defined

// 写法二
new Promise((resolve) => {
  foo.bar()
})
  .then((res) => {
    console.log(res)
    kk()
  })
  .catch((err) => {
    console.log(err)
  })
// ReferenceError: foo is not defined