Skip to content

几个关键问题

  • 改变 promise 状态的三种方式

    javascript
    const p = new Promise((resolve, reject) => {
      // resolve('suc') // pending => resolved
      // reject('fail') // pending => rejected
      // throw new Error('err') // pending => rejected
    })
  • promise 指定多个成功/失败的回调函数,都会调用吗?

    当Promise对象改变状态时对应回调都会调用

    javascript
    const p = new Promise((resolve, reject) => {
      resolve('suc')
    })
    p.then(value => {
      console.log(value) // suc
    })
    p.then(value => {
      console.log(value) // suc
    })
    
    const p2 = new Promise((resolve, reject) => {})
    p2.then(value => {
      console.log(value) // 不执行,状态没有改变
    })
    p2.then(value => {
      console.log(value) // 不执行,状态没有改变
    })
  • 改变 promise 状态和该变状态后的回调谁先执行

    都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调

    javascript
    // 先指定回调再改变状态从而执行回调
    const p = new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('suc')
      }, 1000);
    })
    p.then(value => {
      console.log(value)
    })
    
    // 先改变状态再指定回调并执行回调
    const p = new Promise((resolve, reject) => {
      resolve('suc')
    })
    p.then(value => {
      console.log(value)
    })
    
    // 或者
    setTimeout(() => {
      p1.then(val => {
        console.log(val)
      })
    }, 1000);
  • then回调什么时候执行

    • 如果先改变状态,当定义完 then 回调后会立即调用 then 回调得到数据

    • 如果先指定回调,再改变状态,那么需要等改变状态后才调用 then 回调

  • then()返回的promise对象结果状态由什么决定?

    • 如果抛出异常,返回失败的Promise,reason就是抛出的异常

    • 返回一个非 promise 的任意值,或者不返回,会返回成功的 promise,value 就是返回的 值,不返回时 value 就是 undefined

    • 返回一个 promise,就由这个返回的 promise 决定,可能是fuifilled 或 rejectd 或 pendding

  • Promise 如何串连多个操作任务

    • 通过 then 的链式调用
  • 异常穿透

    当使用 promise 的 then 链式调用时,可以在最后指定失败的回调,前面的任何操作出现了 异常,都会传到最后失败的回调中处理,前面的 then 回调中就可以不指定失败的回调了。 catch()返回 promise,之后可以继续链式调用 then。

  • 中断 promise 链

    当使用Promise的then链式调用时,在中间中断,不再调用后面的回调函数。

    有且只有一种方式:then回调中返回一个 pendding 状态的 Promise 对象。之后因为状态没有 改变,回调都不会执行

    javascript
    const p = new Promise((resolve, reject) => {
      resolve('suc')
    })
    p
    .then(value => {
      console.log(value) // suc
    })
    .then(value => {
      return new Promise((resolve, reject) => {})
    })
    .then(value => {
      console.log(value) // 不执行
    })