首页 > 其他分享 >JS中的promise()方法

JS中的promise()方法

时间:2022-10-15 22:33:11浏览次数:36  
标签:resolve res JS ajax promise reject new 方法

promise的产生的由来

引入概念 :回调地狱

像下方这种在ajax中需要再次发送ajax的需求,就会产生回调地狱

           $.ajax({
                      url: "http://kumanxuan1.f3322.net:8809/destinations/hotRegion",
                      type: "GET",
                      success(res) {
                          $.ajax({
                              url: "http://kumanxuan1.f3322.net:8809/strategies/themes",
                              type: "GET",
                              success(res) {
                                  $.ajax({
                                      url: "http://kumanxuan1.f3322.net:8809/travels/query",
                                      type: "GET",
                                      success(res) {
                                         
                                      }
                                  })
                              }
                          })
                      }
                  })

使用起来及其复杂,难用

故promise的诞生就是为了解决掉回调地狱

 

promise的概念

语法: promise( function ( ){ } )------promise内部需要加一个回调函数

promise 是内置的构造函数

构造函数一般搭配new使用

//例如:var obj =new Object(), new Promise() //object和promise都是构造函数

 

promise的两个参数与三个状态

回调函数也有两个参数----也是一个函数

  • resolve 确定

  • reject 拒绝

               var p =new Promise(function(resolve, reject){
                 resolve();
                 reject();
              })
                 console.log(p);

初始默认状态:pending 未决定的

resolve调用之后 pending 状态改变为 fulfilled 状态 -----成功状态

reject调用之后 pending 状态改变为 reject 状态 -----失败状态

 

promise的特点

1.一旦状态被改变过一次,状态就会产生凝固,后面就再也无法改变状态,

2.状态不会受外界影响

 

promise的基本语法

注"此处的开关模拟的是ajax的请求成功或者失败

               var flag = true
              var p = new Promise((resolve, reject) => {
               if (flag) {
                resolve("产生成功的信息回调")
              } else {
                reject("产生错误的信息回调")
                }
              })

那么要如何处理resolve和reject呢

使用.then函数可以在promise 外部处理请求的结果

        p.then(res => {             //处理resolve的调用  .then会处理成功后的数据
           console.log(res);       //成功的返回数据 res只是一个形参
      })
       p.catch(error => {          //处理reject的调用 .catch会处理成功后的数据
           console.log(error);     //失败的返回数据
      })

 

 

promise解决回调地狱(简化过的)

封装一个函数来使得ajax 参数可以重复调用,

        function sentAjax(url) {
           return Promise((resolve, reject) => {
               $.ajax({
                   url,
                   type: "get",
                   success(res) {
                       resolve(url);
                  },
                   error(err) {
                       reject(err);
                  }
              })
          })
      }
       let p1 = sentAjax("http://kumanxuan1.f3322.net:8809/destinations/hotRegion")
       let p2 = setPromiseAjax("http://kumanxuan1.f3322.net:8809/strategies/themes")
       let p3 = setPromiseAjax("http://kumanxuan1.f3322.net:8809/travels/query")

 

然后在外部使用then来捕获成功处理的函数

使用链式编程来使得一步一步发送

重点:虽然.then.catch 方法是异步程序 但promise 内部是同步的

        p1.then(res => {
           console.log(res);
           return p2            //因为此处标记了return 把p2给抛出才能使得下方的第二个then能和接收到值
      }).then(res => {         //第二个then作用域上一个then返回的对象
           console.log(res);
           return p3
      }).then(res => {
           console.log(res);
      })

 

 

promise的2个使用方法

//场景:页面进来后,发送三个请求,统一处理所有请求

//需求:统一处理三个请求

前部js数据

        let p1 = new Promise((resolve, reject) => {
           setTimeout(() => {
               resolve("成功1")
          }, 3000)
      })
       let p2 = new Promise((resolve, reject) => {
           setTimeout(() => {
               resolve("成功2")
          }, 200)
      })
       let p3 = new Promise((resolve, reject) => {
           setTimeout(() => {
               resolve("成功3")
          }, 40)
      })

 

promise.all方法

promise.a;ll方法类似于&&(与)的相同语法

当内部所有请求都成功时,最终的结果才是成功 then 内部会得到一个数组包含所有请求成功的结果

但一旦发现其中一个结果失败,总的结果就会变成失败,catch内部获取到响应速度最快返回的失败结果

 let p = Promise.all([p1, p2, p3])

 

promise.race方法

谁最快就得到谁,无论结果是成功还是失败

let p =promise.race([p1,p2,p3])
 

标签:resolve,res,JS,ajax,promise,reject,new,方法
From: https://www.cnblogs.com/Dollom/p/16795226.html

相关文章

  • 函数的内置方法
    内置函数就是python给你提供的,拿来直接用的函数.截至到python版本3.6.2python一共提供了68个内置函数,他们就是python直接提供给我们的.作用域相关locals()返回当前作......
  • golang中json.Marshal自定义浮点数格式化样式
    golang中如果有以下的类型typeQpsObjstruct{Keystring`json:"key"`Qpsfloat64`json:"qps"`}json.Marshal后会输出如下的字符串 {"key":"test","qp......
  • django + gunicorn部署,日志丢失解决方法
    近期部署了一个项目,使用的是django开发,服务器是centos7,宝塔+python项目管理器使用项目管理器新建项目,会自动配置虚拟环境,安装库,启动项目,非常不错方便项目采用gunicorn方......
  • JSTL下载jar包和放到项目中
    JSTL一、下载jar包从Apache的标准标签库下载网址:Indexof/dist/jakarta/taglibs/standard/binaries(apache.org)选择jakarta-taglibs-standard-1.1.2进行下载......
  • Django ORM QuerySet转json
    下面是Django中两种常用的ORM查询models.Component.objects.filter(...).all()models.Component.objects.values(...)第一种我们可以使用serializers.serialize("json",c......
  • vue项目时间毫秒转换成标准时间显示(过滤器的使用方法)
    vue项目中有个时间轴,需要转换成标准的年月日的格式打印思路:先vue的文件引入文件main.js里面进行过滤器全局注册,过滤器的处理的处理函数中做转换处理,,在vue表单里应用过......
  • 武汉星起航:亚马逊产品被跟卖的应对方法
    在亚马逊平台,是允许有跟卖的形式存在,当你的产品被一两个卖家跟卖,说明你的产品卖得好,但是如果你的产品被大量跟卖,那就要及时阻止,不然就要给别人作嫁衣了。什么是跟卖?几家欢喜......
  • 关于处理数据类型强制转换的方法
    想必我们在处理数据时常常会遇见需要的数据类型与数据库里的数据类型对应不上的情况,本文会举几个典型的例子来记录如何处理这种情况!XML层处理数据库数据类型为date我们......
  • 24种优化网页速度的终极方法
    什么是网页速度?网页速度是衡量页面内容加载的速度。页面速度可以用“页面加载时间-LCP”(在特定页面上完全显示内容所需的时间)或“首字节时间”(浏览器从网页服务器接收第......
  • 网络通信——HTTP接口访问——移动数据格式JSON
        网络通信的交互数据格式有两大类,分别是JSON和XML。对于App来说,基本采用JSON格式与服务器通信。JSON相比XML的优势主要有两个:(1)手机流量很贵,表达同样的信息,J......