Promise

80 阅读3分钟

一、什么是promise

  1. 什么是回调地狱
    • 回调函数嵌套调用,根据外层异步程序执行结果,调用内层异步程序 setTimeout(function(){ console.log("异步程序1");

           setTimeout(function(){
             console.log("异步请求2");
      
             setTimeout(function(){
               console.log("异步请求3");
             }, Math.round(Math.random()*1000));
      
           }, Math.round(Math.random()*1000));
      
         }, Math.round(Math.random()*1000));
      
  2. 使用Promise优化回调地狱
    • promise是ES6新增的本地对象
    • 作用:用来获取异步数据(优化回调地狱)

二、Promise的基本语法

// 创建一个Promise实例:
const p = new Promise((resolve, reject)=>{
  console.log("正在进行时");
  resolve("已完成")
  reject("已失败")
})
  } )
  p.then(function(res){
    // 写:会在成功后执行的自己的功能
  })
  p.catch(function(res){
    // 写:会在失败后执行的自己的功能
  }

三、原理

  • 使用状态记录异步的执行情况
    • 正在进行时:pendding
    • 已完成:fulfilled
    • 已拒绝:rejected
  • 在Promise内部对这个状态进行监听,当状态发生变化时,根据状态值,执行相应的功能

四、Promise实例的方法

  1. promise.then()
    • promise实例状态为成功时执行
    • 参数:回调函数;回调1用来处理成功状态,回调2用来处理失败状态,回调2可选
    • 返回值:当前promise实例状态对应的回调函数的返回值,这个返回值必然是一个新的Promise实例,哪怕主动返回的不是Promise实例,也会被处理成Promise实例
  1. promise.catch()
    • promise实例状态为失败时执行
    • 参数:回调函数,用来处理失败状态
    • 返回值:回调函数的返回值
  1. promise.finally()
    • promise实例状态为成功或失败时都会执行,表示当前promise结束了
    • 参数:回调函数,用来处理结束后的状态
    • 返回值:回调函数的返回值

五、Promise类的方法

  1. Promise.resolve()
    • 返回一个成功状态的Promise实例
    • 参数:成功状态下的数据
  1. Promise.reject()
    • 返回一个失败状态的Promise实例
    • 参数:失败状态下的数据
  1. Promise.all()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.all()全部子实例都成功才算成功,只要有一个子实例失败就算失败。
    • 参数:多个Promise实例的数组
  1. Promise.any()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.any()只要有一个子实例成功就算成功,所有子实例失败才算失败。
    • 参数:多个Promise实例的数组
  1. Promise.race()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.race()赛跑机制,取决于最先执行结束的子实例的状态
    • 参数:多个Promise实例的数组
  1. Promise.allSettled()
    • 用于将多个 Promise 实例,包装成一个新的 Promise 实例。
    • Promise.allSettled()所有子实例结束,新实例才会完成,包含所有子实例的状态
    • 参数:多个Promise实例的数组

六、异步的终极解决方案:Async / Await

  1. async关键字,在函数的function关键字之前使用,用于表示当前函数是一个异步函数,且函数执行结果自动返回一个成功状态的Promise实例,这个异步函数内的return关键字用于给这个成功状态的Promise实例返回成功时的数据。 async function fn1(){}

    console.log(fn1());		// Promise {<fulfilled>: undefined}
    
    async function fn2(){
        return "hello";
    }
    
    console.log(fn2());		// Promise {<fulfilled>: 'hello'}
    
    fn2().then(res=>{
        console.log(res);		// hello
    })
    
  2. await关键字只能在async声明的异步函数中使用,表示等待。等待一个异步执行结束并返回成功状态时的数据。await可以将异步的函数同步执行,await一般用于等待Promise的状态 async function fn(){ const res = await test(); console.log(res); // success }

    function test(){
        return new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("success");
            },Math.random()*1000)
    
            setTimeout(function(){
                reject("error");
            },Math.random()*2000)
        })
    }