何为promise

发布时间 2023-06-08 11:04:30作者: GTK

请问何为promise ?

先解决一个问题何为 同步 异步

  1. 同步是什么
    1. 同步就是内存中顺序执行的处理器指令
    2. 大白话就是每条指令都会严格按照他们出现的顺序来执行
      // 举例
      let x = 3;       // 第一个执行
      x += 4;          // 第二个执行
      console.log(x);  // 第三个执行 这就是顺序
      
  2. 异步是什么
    1. 类似于系统的中断
    2. 大白话就是这个代码正常执行,而下面的代码正常执行无需等待这个异步代码的执行
    console.log(1);
    setTimeout(()=>console.log(2),1000);  // 这就是一个异步代码
    console.log(3); 
    // 输出 1 3 大约等待1s 再输出2
    
  3. 以往的编程模式(已经抛弃,但可学习)
    1. 这个模式太复杂了
    2. 在settimeout中使用try/catch来控制成功和失败
      function double(value,success,failure) {
         setTimeout(()=>{
            try {
                  if(typeof value !== "number") throw "must provide number as first argument"
                  success(value * 2)
            } catch (error) {
                  failure(error);
            }
         },1000);
      }
      const callback = (value) => console.log(value);
      const failure = (e) => console.log(e);
      double(3,callback,failure);   // 输出 6
      double('3',callback,failure); // 输出 must provide number as first argument
      
    3. 嵌套异步调用(个人感觉这个才是魔鬼)这个也是回调地狱的由来
      function double(value,success,failure) {
         setTimeout(()=>{
            try {
                  if(typeof value !== "number") throw "must provide number as first argument"
                  success(value * 2)
            } catch (error) {
                  failure(error);
            }
         },1000);
      }
      const callback = (value) => {
            double(value,(number)=>console.log(number));
         };
      const failure = (e) => console.log(e);
      // 输出结果
      // must provide number as first argument
      // 12
      // 请思考为什么 must provide number as first argument 比 12 先出现 ?
      

promise 此时应声而出 它是一种异步编程机制

  1. promise是es6中的知识点
    1. 首先它是es6中新增的引用类型Promise,可以使用new进行实例化
    2. 创建的时候需要传入函数作为参数
    3. promise的状态有三种
      1. pending 待定 是最初的状态,但也可以修改其开始状态
      2. fuldiled 兑现 也称 解决 resolve
      3. rejected 拒绝
      4. 可以由pending状态转换为兑现 或 拒绝状态,一旦转换状态,其状态不可逆
    4. promise的两大主要作用
      1. 抽象的表示一个异步操作
      2. 状态转换为兑现 即有一个valu 值
      3. 状态转换为拒绝 即有一个reason 值
    5. 执行函数控制promise状态
      1. resolve() =>兑现
      2. reject() =>拒绝
      3. Promise.resolve() 会返回一个promise对象,可以接收多个参数,但是只会返回第一个参数
      4. Promise.resolve() 等同于 new Promise((resolve,reject)=>resolve())
      5. 与第四点同理Promise.reject(),特殊的是这个不会被try/catch捕获到
    6. promise的实例方法
      1. then()
        1. then里面有两个函数,第一个是用来执行resolve传入的value,第二个是用来执行reject传入的reason
        2. then返回的新promise和原先的promise进行比较是false
        p.then((value)=>{},(reason)=>{});
        
      2. catch相当于是reject的语法糖 只接收一个参数
      3. finally是为了减少then中的onResolve方法和onReject方法出现冗余代码,主要是用来清理代码
      4. promise的传递问题暂时不理解
  2. promise.race() 任意一个完成即执行
  3. promise.add() 全部完成即执行
  4. 搭配 async / await使用