promise

什么是promise呢?

  • 在ES6之前我们自己来设计回调函数
    • 复制代码
         function execCode(counter, succeed, lose) {
              setTimeout(() => {
                if (counter > 0) {
                  //counter判断是否成功
                  let total = 0;
                  for (let i = 0; i < counter; i++) {
                    total += 1;
                  }
                  //成功时回调的函数
                  succeed(total);
                } else {
                  lose(`${total}值有问题`); //失败时回调函数
                }
              }, 3000);
            }
            execCode(
              100,
              (value) => {
                console.log(`${value}成功了`);
              },
              (err) => {
                console.log(err);
              }
            );
      复制代码

       

    • 第一,我们需要自己来设计回调函数,回调函数的名称、回调函数的使用;
    • 第二,对于不同的人,不同的框架设计出来的方案是不同的,那么我们必须耐心去看别人的源码或者文档,才知道这个函数怎么使用。
  • promise是一个类,可以翻译成 承诺、许诺、期约;
  • 我们使用的时候给予调用者一个promise,后面回调函数时,就可以创建一个promise对象
  • 在我们通过new创建promise对象时,我们需要传入一个回调函数,我们称之为execuror
    • 这个回调函数会被立即执行,并且给这个函数传入另外两个回调函数resolve、reject;
    • 当调用resolve回调函数时,会执行promise对象的then方法传入的回调函数
    • 当调用reject回调函数时,会执行promise对象的catch方法传入的回调函数

Promise代码结构

  • Promise代码结构
    • 复制代码
       1  const promise = new Promise((resolve, reject) => {
       2         resolve("哈哈哈哈"); //成功时调用
       3         reject("失败了"); //失败时调用
       4       });
       5       promise
       6         .then((res) => {
       7           //调用resolve执行then方法的回调函数
       8           console.log(res);
       9         })
      10         .catch((err) => {
      11           //调用reject执行catch方法的回调函数
      12           console.log(err);
      13         });
      复制代码
  • 上面Promise使用过程,可以分为3个状态
    • 待定(pending):初始状态,既没有被兑现,也没有被拒绝;当执行executor中的代码时,处于该状态
    • 已兑现(fulfilled):意味着操作成功完成;执行了resolve时,处于该操作,promise已经被兑现;
    • 已拒绝(rejected):意味着操作失败;执行了reject时,处于该状态,promise已经被拒绝
    • 注意:promise的状态一旦被确定下来,就不会再更改,也不能在执行某一个回调函数来改变状态。

executor

  • executor是在创建promise时需要传入的一个回调函数,这个回调函数会被立即执行,并且有两个参数,
  • 通常我们会在Executor中确定我们的promise状态
    • 通过resolve,可以兑现promise的状态,我们也可以称之为已决议(resolved);
    • 通过reject,可以拒绝(reject)Promise的状态;

resolve的特殊值

  • 如果resolve传入一个普通值或者对象,那么这个值会作为then回调的参数。
  • 如果resolve的值的是本身promise对象,那么当前的promise的状态会由传入的promise来决定
  • 如果resolve中传入的是一个对象,并且这个对象有then方法,那么会执行该then方法,并且根据then方法的结果来决定promise的状态

then方法参数

  • then方法中可以写入两个回调函数,第一个是兑现状态,第二个是结束状态。
  •  then方法本身是有返回值的,它的返回值是一个promise所以可以进行链式调用
  • then的回调函数中如果有返回值则等于resolve(返回值);没有返回值则后面的then接收到是undefind

catch方法

  • catch方法也是promise对象上的一个方法(实例方法);他也是放在promise原型上的
  • 一个promise的catch方法是可以被多次调用的
  • catch方法也是会返回一个promise对象的,所以catch方法后面我们可以继续调用then方法或者catch方法;
  • 让catch的promise返回值是reject()则需要调用thow new Error('错误叙述')抛出异常;

finally方法

  • finally是在ES9中新增的一个特性:表示无论Promise对象无论变成fulfilled还是reject状态,最终都会被执行的代码
  • finally方法是不接收参数的,因为无论前面是fulfilled状态,还是rejected状态,它都会执行。

resolve,reject类方法 

  • 前面学习的then、catch、finally方法都属于Promise的实例方法,都是存放在Promise的Prototype上的
  • Pomise.resolve等于new promise,并执行resolve函数
  • Pomise.reject等于new promise,并执行reject函数

all类方法

  •  promise.all的作用是将多个promise包裹在一起形成一个新的promise;
  • all方法其中一个promise变成reject状态时,新的promise就会立即变成对应的reject状态。
  • 新的promise状态由包裹的所有promise共同决定:
    • 当所有的promise状态变成fulfil led状态时,新的Promise状态为fulfilled,并且会将所有的Promise的返回值组成一个数组;
    • 当有一个Promise状态为reject时,新的promise状态为reject,并且会将第一个reject的返回值作为参数;

allSettled类方法

  • 该方法会在所有的promise都有结果(settled),无论是fulfilled,才会有最终的状态;
  • 并且这个Promise的结果一定是fulfilled的;

reca类方法

  • rece是竞赛的意思,表示多个Promise相互竞争,谁先有结果,那么就能使用谁的结果。

any类方法

  • any和rece方法类似
  • any方法会等到一个fulfilled,才会更新promise的状态;
  • 如果所有的promise都是reject的,那么也会等到所有的promise都变成rejected状态
  • 如果所有的Promise都是reject的,那么自己会报以一个AggregateError的错误。
posted @   biu~a  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示