Promise理解

1.Promise含义

语法上来说,Promise是一个对象,它代表了一个异步操作的最终完成或者失败。所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

2.Promise用法

一个 Promise 必然处于以下几种状态之一:

  1. 待定(pending):初始状态,既没有成功,也没有失败。
  2. 已处理(fulfilled):意味着操作成功完成。
  3. 已拒绝(rejected):意味着操作失败。

Promise对象的三种状态不受外界影响,状态改变只有两种情况:pending -> fulfilled(已处理) / rejected(已拒绝)。任意一种情况发生时,通过 Promisethen 方法的处理程序将被调用。如果一个 Promise 已经成功或拒绝,那么则称之为已敲定(settled),就是不会再变化了,将一直保持该状态。
基本用法:

// 创建Promise对象:
const promise = new Promise(function(resolve, reject) {
  // 异步操作
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) {
  // 处理fulfilled状态
}, function(error) {
  // 处理rejected状态
});
 
promise
.then((value) => {
  // 处理fulfilled状态
  return value2;
})
.then((value2) => {
  // 处理fulfilled状态
})
.catch((error) => {
  // 处理rejected状态
});

Promise链式反应:链中每个已兑现的 Promise 的返回值会传递给下一个.then(),而已拒绝的 Promise 会把失败原因传递给链中下一个拒绝处理函数。

3.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) => {
            resolve('成功了')
        })
let p2 = new Promise((resolve, reject) => {
            resolve('success')
        })
let p3 = Promise.reject('失败')
        
Promise.all([p1, p2]).then((result) => {
      console.log(result)
}).catch((error) => {
      console.log(error)
}) // 打印 ['成功了‘,'success']

Promise.all([p1, p3, p2]).then((result) => {
      console.log(result)
}).catch((error) => {
      console.log(error)
}) // 打印 '失败'

Promise.race().

 const promise1 = new Promise((resolve, reject) => {
       setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
       setTimeout(resolve, 100, 'two');
});

 Promise.race([promise1, promise2]).then((value) => {
       console.log(value);
       // 都resolve, 但是promise2更快 打印‘two’
});

4.面试技巧

1.Promise解决了什么问题?
Promise解决了回调地狱的问题。在以前的JavaScript代码中,多个异步操作嵌套过深,难以维护和理解,这就是所谓的回调地狱。而Promise可以让异步操作按照顺序执行,并且可以链式调用,使得代码更加清晰和易于管理。同时,Promise还可以处理异步操作的成功和失败,使得错误处理更加方便。
2.setTimeout、Promise、Async/Await 的区别

  • settimeout
    它的回调函数放到宏任务队列里,等到执行栈清空以后执行
  • Promise
    它本身是同步的立即执行函数,当在executor中执行resolve或者reject的时候,此时是异步操作,会先执行then/catch等,当主栈完成后,才会去调用resolve/reject中存放的方法执行。
  • Async/Await
    它们返回一个 Promise对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再执行函数体内后面的语句。可以理解为,是让出了线程,跳出了 async 函数体。
async function async1(){
   console.log('async1 start');
    await async2();
    console.log('async1 end')
}
async function async2(){
    console.log('async2')
}

console.log('script start');
async1();
console.log('script end')

// 输出顺序:script start->async1 start->async2->script end->async1 end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值