携手创作,共同成长!这是我参与「掘金日新计划 · 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()
- Promise.resolve(): 返回的是一个解析后的
Promise对象,如果这个值本身就是一个 promise ,那么将返回这个 promise对象。如果这个值是带有.then的方法,那么Promise会跟着这个对象,采用它的最终状态。 - .Promise.reject() : 返回一个带有拒绝原因的
Promise对象,通过使用Error的实例获取错误原因 - Promise.all() : 返回一个新的
promise实例, 只有所有的 promise 都成功才成功, 只要有一个失败了就直接失败,Promise.all() 里面的参数为一个数组 - Promise.race():返回最快完成那一个
Promise。只要参数数组中有一个 Promise 实例执行 resolve 回调或 reject 回调后,新实例就直接返回结果。 - Promise.any(),接收一个由
`promise组成的对象,返回第一个成功执行完成的promise值 - Promise.allSettIed(),返回一个在所有给定的 promise 都已经
fulfilled或rejected后的 promise,并带有一个对象数组,每个对象表示对应的 promise 结果。
Promise.实例方法
Promise.实例方法有3个
- Promise.prototype.catch()
- Promise.prototype.then()
- Promise.prototype.finally()
- Promise.prototype.catch() : 添加一个被拒绝状态的回调函数,并返回一个新的 promise
- Promise.prototype.then() : 返回一个新的
Promise实例,then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数 - Promise.prototype.finally: 返回一个
Promise,它仅用于无论最终结果如何都要执行的情况。
改变 promise 状态和指定回调函数谁先谁后?
-
都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调
-
如何先改状态再指定回调?
- 在执行器中直接调用 resolve()/reject()
- 延迟更长时间才调用 then()
-
什么时候才能得到数据?
- 如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据
- 如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据
pro mise .then()返回的新 promise 的结果状态由什么决定?
-
简单表达: 由 then()指定的回调函数执行的结果决定
-
详细表达:
- 如果抛出异常, 新 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 对象