Promise理解
Promise含义
语法上来说,Promise
是一个对象,它代表了一个异步操作的最终完成或者失败。所谓Promise
,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise用法
一个 Promise
必然处于以下几种状态之一:
- 待定(pending):初始状态,既没有成功,也没有失败。
- 已处理(fulfilled):意味着操作成功完成。
- 已拒绝(rejected):意味着操作失败。
Promise
对象的三种状态不受外界影响,状态改变只有两种情况:pending -> fulfilled(已处理) / rejected(已拒绝)。任意一种情况发生时,通过 Promise
的 then
方法的处理程序将被调用。如果一个 Promise
已经成功或拒绝,那么则称之为已敲定(settled),就是不会再变化了,将一直保持该状态。
基本用法:
// 创建Promise对象: |
Promise
链式反应:链中每个已兑现的 Promise
的返回值会传递给下一个.then()
,而已拒绝的 Promise
会把失败原因传递给链中下一个拒绝处理函数。
Promise并发
Promise
类提供了四个静态方法来促进异步任务的并发:
方法 | 简介 |
---|---|
Promise.all(). | 在所有传入的 Promise 都被兑现时兑现;在任意一个 Promise 被拒绝时拒绝。 |
Promise.allSettled(). | 在所有的 Promise 都被敲定时兑现。 |
Promise.any(). | 在任意一个 Promise 被兑现时兑现;仅在所有的 Promise 都被拒绝时才会拒绝。 |
Promise.race(). | 在任意一个 Promise 被兑现时兑现;在任意一个的 Promise 被拒绝时拒绝。 |
Promise.all().
let p1 = new Promise((resolve, reject) => { |
Promise.race().
const promise1 = new Promise((resolve, reject) => { |
面试技巧
Promise解决了什么问题?
Promise
解决了回调地狱的问题。在以前的JavaScript代码中,多个异步操作嵌套过深,难以维护和理解,这就是所谓的回调地狱。而Promise
可以让异步操作按照顺序执行,并且可以链式调用,使得代码更加清晰和易于管理。同时,Promise
还可以处理异步操作的成功和失败,使得错误处理更加方便。
setTimeout、Promise、Async/Await 的区别?
settimeout
它的回调函数放到宏任务队列里,等到执行栈清空以后执行Promise
它本身是同步的立即执行函数,当在executor
中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会去调用resolve/reject中存放的方法执行。- ``Async/Await
它们返回一个
Promise对象,当函数执行的时候,一旦遇到
await就会先返回,等到触发的异步操作完成,再执行函数体内后面的语句。可以理解为,是让出了线程,跳出了
async` 函数体。
async function async1(){ |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Zulitの部落群!
评论