promise

111 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第七天,点击查看活动详情 >>

介绍:Promise是对象用来封装一个异步操作,获取到的成功或者失败返回的值。作用:解决回调地狱

能够把异步操作最终的成功或者失败原因和相关处理程序关联起来,这样使得异步方法可以像同步方法那样返回值。但异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者

一个Promise有3中状态

待定(pending):初始状态,既没有被兑现,也没有被拒绝。 已兑现(fulfilled):意味着操作成功完成。 已拒绝(rejected):意味着操作失败。

如何改变 promise 的状态

  • resolve(value): 如果当前是 pending 就会变为 resolved
  • eject(reason): 如果当前是 pending 就会变为 rejected
  • 抛出异常: 如果当前是 pending 就会变为 rejected

一个promise指定多个成功 / 失败回调函数, 都会调用吗?

当 promise 改变为对应状态时都会调用

Promise对象的状态改变, 只有两种可能:

1.从pending变为fulfilled 此时应该执行 resolve()

2.从pending变为rejected

此时应该执行 reject();

Promise静态方法

  • Promise.all()
  • Promise.allSettIed()
  • Promise.any()
  • Promise.race()
  • Promise.reject()
  • Promise.resolve()

Promise静态方法有6种,常用的静态方法有4种,Promise.resolve(),Promise.reject(),Promise.all(),Promise.race()

  1. Promise.resolve(): 返回的是一个解析后的Promise对象,如果这个值本身就是一个 promise ,那么将返回这个 promise对象。如果这个值是带有.then的方法,那么Promise会跟着这个对象,采用它的最终状态。
  2. .Promise.reject() : 返回一个带有拒绝原因的 Promise对象,通过使用 Error 的实例获取错误原因
  3. Promise.all() : 返回一个新的 promise实例, 只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败,Promise.all() 里面的参数为一个数组
  4. Promise.race():返回最快完成那一个 Promise。只要参数数组中有一个 Promise 实例执行 resolve 回调或 reject 回调后,新实例就直接返回结果。
  5. Promise.any(),接收一个由`promise 组成的对象,返回第一个成功执行完成的promise值
  6. Promise.allSettIed(),返回一个在所有给定的 promise 都已经fulfilledrejected后的 promise,并带有一个对象数组,每个对象表示对应的 promise 结果。

Promise.实例方法

Promise.实例方法有3个

  • Promise.prototype.catch()
  • Promise.prototype.then()
  • Promise.prototype.finally()
  1. Promise.prototype.catch() : 添加一个被拒绝状态的回调函数,并返回一个新的 promise
  2. Promise.prototype.then() : 返回一个新的Promise实例,then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数
  3. Promise.prototype.finally: 返回一个Promise,它仅用于无论最终结果如何都要执行的情况。

改变 promise 状态和指定回调函数谁先谁后?

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

  2. 如何先改状态再指定回调?

    • 在执行器中直接调用 resolve()/reject()
    • 延迟更长时间才调用 then()
  3. 什么时候才能得到数据?

    • 如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
    • 如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据

pro mise .then()返回的新 promise 的结果状态由什么决定?

  1. 简单表达: 由 then()指定的回调函数执行的结果决定

  2. 详细表达:

    • 如果抛出异常, 新 promise 变为 rejected, reason 为抛出的异常
    • 如果返回的是非 promise 的任意值, 新 promise 变为 resolved, value 为返回的值
    • 如果返回的是另一个新 promise, 此 promise 的结果就会成为新 promise 的结果

pro mise 如何串连多个操作任务?

  • promise 的 then()返回一个新的 promise, 可以开成 then()的链式调用
  • 通过 then 的链式调用串连多个同步/异步任务

pro mise 异常传透?

  • 当使用 promise 的 then 链式调用时, 可以在最后指定失败的回调,
  • 前面任何操作出了异常, 都会传到最后失败的回调中处理

中断 promise 链?

  • 当使用 promise 的 then 链式调用时, 在中间中断, 不再调用后面的回调函数
  • 办法: 在回调函数中返回一个 pendding 状态的 promise 对象