不为人知的Promise的用法

对Promise的理解以及Promise的基本用法 一、理解Promise ① 定义 ② 优点 ③ 特点 ④ 缺点 二、Promise基本用法 ① resolve函数的作用 ② reject函数的作用 ③ then方法 ④一个异步加载图片的例子 三、Promise的其他常见方法 ①Promise.prototype.then() ②Promise.prototype.catch() ③Promise.prototype.finally() ④Promise.all() ⑤Promise.race() 四、 阅读详情

Promise

Promise是什么?

  1. 主要用异步计算
  2. 可以异步操作队列化,按照期望的顺序执行,返回符合的数据
  3. 可以再对象之间传递和操作promise,帮我们处理队列

为什么会有Promise呢?

为了避免任务冻结
  • 同步:假设你去了一家饭店,找个位置,叫来服务员,这个时候服务员对你说,对不起我是“同步”服务员,我要服务完这张桌子才能招呼你。那桌客人明明已经吃上了,你只是想要个菜单,这么小的动作,服务员却要你等到别人的一个大动作完成之后,才能再来招呼你,这个便是同步的问题:也就是“顺序交付的工作1234,必须按照1234的顺序完成”。
  • 异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,。等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺序无关,所以叫“异步”。

异步操作常见的语法

  • 事件监听
<script>
        document.addEventListener("click", function(){
            console.log("你点击了我");
        });
</script>
  • ajax请求的回调函数
<script>
        ajax("https://www.baidu.com", {
            success : function(data){
                // 必须在ajax请求成功的时候才会执行这个成功函数回调函数
                console.log(data);
            }
        });
</script>
  • 定时器 延时器
    <script>
        setInterval(function () {

            // 没过一秒钟执行一次
            console.log("hello");
        }, 1000);

        setTimeout(function () {

            // 页面加载之后延迟一秒后执行
            console.log("hello");
        }, 1000);
    </script>

异步回调的问题

  • 之前处理异步是通过纯粹的回调函数的形式进行处理的
  • 很容易进入回调地狱中,同时回调地狱中剥夺了函数的return的能力
  • 问题可以解决,但是难以读懂,维护困难
  • 容易进入回调地狱-嵌套层次深-不好维护

15311104-f36baae9a21490c7.jpg

一般情况下,我们一次调用API就可以完成请求。

有些情况我们需要多次调用服务器API,就会形成一个链式调用,比如为了完成一个功能,我们需要调用API1,API2,API3,依次按照顺序进行调用,这个时候就会出现回调地狱的问题。

promise
  • promise是一个对象,他可以用来保存状态。
  • 并剥夺return的能力,因此无需层层传递callback,进行回调获取数据
  • 代码风格,容易理解,便于维护。
  • 使用多个异步等待合并便于解决
promise详解
new Promise( ( resolve, reject ) => {

    resolve("成功");
} ).then(
    res => {
        console.log(res);
    },
    error => {
        console.log(error);
    }
);
  • resolve作用是将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

  • promise有三个状态:

    1. pending : 初始化状态
    2. fulfilled : 操作成功状态
    3. rejected : 失败状态

    当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;
    promise状态一经改变,不会再变。

  • Promise状态改变,只有两种情况

    从pending变为fulfilled

    从pending变为rejected

最简单的案例
new Promise(resolve => {
  setTimeout(() => {
    resolve('hello')
  }, 2000)
}).then(res => {
  console.log(res)
})
分两次,顺序执行
new Promise(resolve => {
    setTimeout(() => {
      resolve('hello')
    }, 2000)
  }).then(val => {
    console.log(val) //  参数val = 'hello'
    return new Promise(resolve => {
      setTimeout(() => {
        resolve('world')
      }, 2000)
    })
  }).then(val => {
    console.log(val) // 参数val = 'world'
  })

结论:promise作为队列最为重要的特性,我们在任何一个地方生成了一个promise队列之后,我们可以把他作为一个变量传递到其他地方。

Promise.all()批量处理

Promise.all([p1, p2, p3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果

//切菜
    function cutUp(){
        console.log('开始切菜。');
        var p = new Promise(function(resolve, reject){        //做一些异步操作
            setTimeout(function(){
                console.log('切菜完毕!');
                resolve('切好的菜');
            }, 1000);
        });
        return p;
    }

    //烧水
    function boil(){
        console.log('开始烧水。');
        var p = new Promise(function(resolve, reject){        //做一些异步操作
            setTimeout(function(){
                console.log('烧水完毕!');
                resolve('烧好的水');
            }, 1000);
        });
        return p;
    }

    Promise.all([cutUp(), boil()])
        .then((result) => {
            console.log('准备工作完毕');
            console.log(result);
        })
Promise.race()类似于Promise.all(),只不过他是只需要一个成功就算全部状态成功(返回第一个成功状态的结果)
let p1 = new Promise(resolve => {
        setTimeout(() => {
            resolve('I\`m p1 ')
        }, 1000)
    });
    let p2 = new Promise(resolve => {
        setTimeout(() => {
            resolve('I\`m p2 ')
        }, 2000)
    });
    Promise.race([p1, p2])
        .then(value => {
            console.log(value)
        })
  • 常见用法:

    异步操作和定时器在一起,如果定时器先触发那告知用户超时

  • 现实中的用法

    回调包装成Promise,他有两个显而易见的好处

    1. 可读性好
    2. 返回的结果可以加入其它的Promise队列进行操作

回调地狱的代码和Promise的代码对比

/***
   第一步:找到北京的id
   第二步:根据北京的id -> 找到北京公司的id
   第三步:根据北京公司的id -> 找到北京公司的详情
   目的:模拟链式调用、回调地狱
 ***/
 
 // 回调地狱
 // 请求第一个API: 地址在北京的公司的id
 $.ajax({
   url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/city',
   success (resCity) {
     let findCityId = resCity.filter(item => {
       if (item.id == 'c1') {
         return item
       }
     })[0].id
     
     $.ajax({
       //  请求第二个API: 根据上一个返回的在北京公司的id “findCityId”,找到北京公司的第一家公司的id
       url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/position-list',
       success (resPosition) {
         let findPostionId = resPosition.filter(item => {
           if(item.cityId == findCityId) {
             return item
           }
         })[0].id
         // 请求第三个API: 根据上一个API的id(findPostionId)找到具体公司,然后返回公司详情
         $.ajax({
           url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/company',
           success (resCom) {
             let comInfo = resCom.filter(item => {
               if (findPostionId == item.id) {
                 return item
               }
             })[0]
             console.log(comInfo)
           }
         })
       }
     })
   }
 })
// Promise 写法
  // 第一步:获取城市列表
  const cityList = new Promise((resolve, reject) => {
    $.ajax({
      url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/city',
      success (res) {
        resolve(res)
      }
    })
  })

  // 第二步:找到城市是北京的id
    cityList.then(res => {
      let findCityId = res.filter(item => {
        if (item.id == 'c1') {
          return item
        }
      })[0].id
      
      findCompanyId().then(res => {
        // 第三步(2):根据北京的id -> 找到北京公司的id
        let findPostionId = res.filter(item => {
            if(item.cityId == findCityId) {
              return item
            }
        })[0].id

        // 第四步(2):传入公司的id
        companyInfo(findPostionId)

      })

    })

  // 第三步(1):根据北京的id -> 找到北京公司的id
  function findCompanyId () {
    let aaa = new Promise((resolve, reject) => {
      $.ajax({
        url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/position-list',
        success (res) {
          resolve(res)
        }
      })
    })
    return aaa
  }

// 第四步:根据上一个API的id(findPostionId)找到具体公司,然后返回公司详情
function companyInfo (id) {
  let companyList = new Promise((resolve, reject) => {
    $.ajax({
      url: 'https://www.easy-mock.com/mock/5a52256ad408383e0e3868d7/lagou/company',
      success (res) {
        let comInfo = res.filter(item => {
            if (id == item.id) {
               return item
            }
        })[0]
        console.log(comInfo)
      }
    })
  })
}
Promise的用法及案列 创建一个类(或构造函数),用于生成Promise对象。在该构造函数中,定义状态(Pending、Resolved、Rejected)和存储结果或错误信息的变量。同时,定义。 阅读详情

相关推荐

什么是Promise.all(),它的用法是什么?

是 JavaScript 中用于处理多个 Promise 的方法。它接受一个可迭代对象(如数组)作为参数,并返回一个新的 Promise,该 Promise 在所有输入的 Promise 完成后解决,或者在任何一个输入的 Promise 被拒绝时拒绝。

qq_38822390的博客 1431

Promise.all()

promise.all()有一个请求reject,如何处理。promise.all的使用

开发要有产品的思维 399

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 193

Promise学习:promise.all()方法

例子: Promise.all([1,2,3]) .then( all => { console.log('1: ',all); return Promise.all([function(){ console.log("ooxx") },"xxoo",false]) }) .then( all => { con...

star094606的博客 753

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

多个Promise中获取第一个成功的Promise

多个Promise中获取第一个成功的Promise 有这么一个需求,多张图片或者多个.mp4文件,哪一个先加载出来,就使用哪一个,加载失败的不处理。 这种需求的话就想要用到Promise来实现 多个Promise获取第一个成功的promise 一、Promise.all 改进 Promise.all(iterable) 这个方法返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable里面的promi

guoqkmiss的博客 2029

MOS管驱动电路设计全攻略

MOS管驱动电路设计全攻略

让你爱上电路设计 3634

Promise.all做并发限制

Promise.all做并发限制。

寬真 545

Cesium 入门

Viewer:主要窗口Cesium 展示三维要素内容的主要窗口,包含三维地球的视窗,还包含了一些基础控价const viewer = new Cesium.Viewer('div的ID',{ options可选参数 },包括图层)options可选参数animation: false, 隐藏动画效果timeline:false, 隐藏时间轴等等Scene:场景类,隐藏地球图层Entity:实体类。

虎康的博客 3665

软件设计师---计算机系统

软件设计师---计算机系统

我从不打没有准备的仗! 3万+

Promise.all的使用,处理多个并发请求

其实正常的业务中,按理来说 是一个按钮控制一个请求,处理一项业务。 但有的时候还是会出现 一个按钮控制多个并发请求的业务,这几个请求之间还没有关联。 但问题是,你得知道所有的请求处理完成之后,要给用户一个反馈的。 这个时候 如果使用传统的ajax请求的话,好像我们不知道啥时候 所有的并发请求都处理完了,或者是 那个请求出了问题 然后报出对应的错误。 其实通过一个系统的设计还是能用es5的方式处理这些并发请求的 但今天就讲解下 promise.all的用法,让你快速实现呢,promise这个东西出来也好几年了

业余前端的职业经历 6260

深入解读WT软件湍流强度计算与分析

深入解读WT软件湍流强度计算与分析

weixin_46713695的博客 1021

详解Promise用法

Promise 是 JavaScript 中用于处理异步操作的一种重要机制。Promise 用于解决 JavaScript 中异步操作的复杂性,通过状态管理、链式调用、错误处理等功能,实现代码的清晰、有序与可维护,避免回调地狱,提升异步编程的效率与体验。

qq_52869537的博客 1269

YOLOv8的二次创新 | 结合iRMB与EMA打造全新的iEMA机制,提升动态检测性能【附保姆级代码】

YOLOv8继承了YOLO系列的轻量化和高效检测特性,同时通过改进的架构设计使得其在实时场景下具有更高的检测精度。然而,随着检测需求的增加,尤其是在动态目标检测和长时间序列检测中,YOLOv8的鲁棒性依然可以提升。通过iEMA机制的引入,我们将在这些方面进行进一步优化。iRMB模块是我们对传统Residual Block的进一步改进。通过多层特征提取,iRMB能够捕捉更多层次的特征信息,并通过引入轻量化的残差结构,提升计算效率。

一键难忘的博客 3085

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

9 个必须知道的 Promise 高级用法

Promise 对象代表一个异步操作的最终完成(或失败)及其结果值。then()then()Promise 的特征之一是。

qq_28791753的博客 3315

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

React—Promise用法

Promise是什么? 从用途上来说: (1)promise主要用于异步计算。 (2)可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。 (3)可以在对象之间传递和操作promise,帮助我们处理队列。 从语法上说: (1)Promise 是一个对象,从它可以获取异步操作的消息。 (2)Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理 Promis...

午夜阳光 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

promise用法总结以及手写promise

Promise.all() 接收一个 Promise 数组,返回一个新的 Promise,当所有的 Promise 都成功时,该 Promise 会成功,返回一个数组。Promise.allSettled() 接收一个 Promise 数组,返回一个新的 Promise,无论所有的 Promise 是成功还是失败,都会在所有 Promise 结束后返回。Promise.any() 返回一个新的 Promise,它会在第一个成功的 Promise 返回时成功。

涂涂 1579

promise() 用法

es6 promise() 用法 Promise 是异步操作,用于解决回调函数和事件 模拟promise环境 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width...

hammer1010的博客 2547

Promise用法

new Promise的时候先执行executor函数,打印出 1、2,Promise在执行resolve时,触发微任务,还是继续往下执行同步任务, 执行p1.then时,存储起来两个函数(此时这两个函数还没有执行),然后打印出3,此时同步任务执行完成,最后执行刚刚那个微任务,从而执行.then中成功的方法。Promise.all()方法的效果是"谁跑的慢,以谁为准执行回调",那么相对的就有另一个方法"谁跑的快,以谁为准执行回调",这就是Promise.race()方法,这个词本来就是赛跑的意思。

油墨香^-^的博客 1万+

Promise用法的简单学习记录

主要学习和摘录《JavaScript重难点实例精讲》中的内容。

blucod的博客 723

promise的用法

回调方法:就是将一个方法 func2 作为参数传入另一个方法 func1 中,当 func1 执行到某一步或者满足某种条件的时候才执行传入的参数 func2Promise 是 ES6 引入的异步编程的新解决方案。Promise 对象三种状态:初始化、成功、失败 pending-进行中、resolved-已完成、rejected-已失败就好像,你跟你女朋友求婚,她跟你说她要考虑一下,明天才能给你答案,这就是承诺(promise)。

qq_45814648的博客 1227

js Promise.all 和 Promise.allSettled 的区别和用法

js Promise.all 和 Promise.allSettled 的区别和用法

Lai助网络科技的博客 999

Promise用法总结

Promise是ES6的新特性,是异步编程的一种解决方案 从语法上说,Promise是一个对象,从它可以获取异步操作的消息,可以解决回调地狱(回调地狱嵌套回调函数) Promise的含义:本身不是异步,是封装异步操作容器,统一异步的标准 Promise对象的特点:对象的状态不受外界影响,一旦状态改变,就不会再变,任何时候都可以得到这个结果 一.前引 js中的异步操作有哪些 ajax请求 var xhr = new XMLHttpRequest(); xhr.onreadystatechange=fu

qq_50384924的博客 1万+

整会promise这8个高级用法,再被问倒来喷我

promise高级用法

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1895

promise的基本用法

promise的用法 promise是一个构造函数,自身有all,resolve,reject等方法,原型上有then,catch等方法。并且它new的实例对象特包含这些方法。通常将他包在一个函数中然后返回一个promise对象。 function hins(){ let name = new Promise(function(resolve,reject){ setTimeout(function(){ console.log('异步执行完成'); resolve('hinschueng') }

sunlando的博客 6101
上一篇: JS函数封装
下一篇: Promise的用法
小小荧
博客等级 码龄9年 133粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值