首页 > 其他分享 >promise

promise

时间:2023-03-05 23:33:06浏览次数:34  
标签:resolve 函数 Promise reject 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的错误。

标签:resolve,函数,Promise,reject,promise,方法
From: https://www.cnblogs.com/ffhyy/p/17179783.html

相关文章

  • ES6-ES11 Promise实践练习-多个文件内容读取
    原视频//引入fs模块constfs=require("fs");//fs.readFile('./resources/为学.md',(err,data1)=>{//fs.readFile('./resources/插秧诗.md',(err,data2)......
  • ES6-ES11 Promise.prototype.then方法
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • ES6-ES11 Promise封装读取文件
    原视频//1.引入fs模块constfs=require('fs');//2.调用方法读取文件//fs.readFile('./resources/为学.md',(err,data)=>{////如果失败,则抛出错误//......
  • ES6-ES11 Promise封装AJAX
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><titl......
  • ES6-ES11 promise介绍与基本使用
    原视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title......
  • 12——Promise
    第十二周Promise初识PromisePromise异步操作的一种解决方案回调函数,异步操作的一种解决方案什么时候使用一般用来解决层层嵌套的回调函数,(回调地狱callbac......
  • 5.使用Promise实现串行
    实现promise的核心思想是借助reduce 第一步constres=[]//定义一个接受不同promise执行结果的数组第二步返回一个promise对象returnnewPromise((resolve,rej......
  • 4.Promise
    1.什么是promisePromise是异步编程的一种解决方案:从语法上来讲,promise是一个对象,从他可以获取异步操作的消息;从本意上来讲。他是一个承诺,承诺他过一段时间会给你一个结果......
  • 第125篇: 期约Promise基本特性
    好家伙,本篇为《JS高级程序设计》第十章“期约与异步函数”学习笔记 1.非重入期约1.1.可重入代码(百度百科)先来了解一个概念可重入代码(Reentrycode)也叫纯代码(Pure......
  • 关于Javascript——Promise的一些理解
    Promise是一个构造函数,promise是通过Promise构造函数声明的对象。 promise对象用来“管理”一次异步任务。 通过newPromise()声明一个promise对象的时候需要传两个参......