Promise

237 阅读1分钟

Promise

new Promise((resolve, reject) => {
  resolve() // 成功
  // reject() // 失败
})
Promise有三种状态
  • pending [待定] 初始状态
  • fulfilled[实现] 操作成功
  • rejected[被否决] 操作失败

resolvePromise状态从pending变成fulfilled rejectedPromise状态从pending变成rejected 一旦状态改变, 就不会再修改

Promise.then(success => {}, err => {}) 参数为两个回调函数, 第一个成功时触发, 第二个失败时触发 Promise.finally(() => {}) 该方法回调内没有参数, 无论resovel还是rejected都会执行, 因此finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。

Promise链式调用

Promise.then()返回一个Promise, 所以可以使用.then().then()...的链式调用, 但是当第一个then有异步操作, 就无法保证和之后的then中内容的执行顺序,例如:

function delay (t) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(t, 'ms后打印')
      resolve()
    }, t);
  })
}
delay(100)
.then(() => {
  delay(2000)
}).then(() => {
  delay(300)
})
// 结果
// 100 ms后打印
// 300 ms后打印
// 2000 ms后打印

.then()内的回调函数返回Promise时, 会等待Promise结束后再执行下一个then, 例如:

function delay (t) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(t, 'ms后打印')
      resolve()
    }, t);
  })
}
delay(100).then(() => {
  return delay(2000)
}).then(() => {
  delay(300)
})
// 结果
// 100 ms后打印
// 2000 ms后打印
// 300 ms后打印

Promise静态方法

  • Promise.all([]) 参数: Promise数组, 数组内的Promise全部完成该Promise完成
  • Promise.race([]) 同上, 有一个完成就算完成