Promise 介绍与基本使用 - 学习笔记

Promise 介绍与基本使用

  • 1、 `Promise` 是什么?
  • 2、创建 `Promise` 实例对象
  • 3、Promise 实例方法
  • 4、Promise 的基本工作流程
  • 5、实例方法
  • 6、静态方法
  • 7、`async` 和 `await`
    • 7.1、关键字
    • 7.2、实例
    • 7.3、区别
    • 7.4、为什么使用 `async/await` 比较好?

1、 Promise 是什么?

  • 所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

  • Promise 是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理和更强大。

  • Promise 对象,可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

  • Promise 对象提供统一的接口,使得控制异步操作更加容易。

2、创建 Promise 实例对象

  • 简单抽奖实例
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
        integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">

</head>

<body>
    <div class="container">
        <h2 class="page-head">Promise 初体验</h2>
        <button type="button" class="btn btn-primary" id="btn">点击抽奖</button>
    </div>


    <script>
        const btn = document.getElementById('btn')
        btn.addEventListener('click', function () {
            // Promise 形式实现
            const p = new Promise((resole, reject) => {
                // resole:解决,函数类型的参数 - 异步任务成功的时候调用
                // reject:拒绝,函数类型的参数 - 异步任务失败的时候调用

                // Promise 可以包裹一个异步任务
                setTimeout(() => {
                    let n = Math.floor((Math.random() * 100) + 1)
                    if (n <= 30) {
                        // 成功 - 调用 resole   将 Promise 对象(p)的状态设置为 【成功】
                        resole(n)
                    } else {
                        // 失败 - 调用 reject  将 Promise 对象(p)的状态设置为 【失败】
                        reject(n)
                    }
                }, 1000)
            })
                // 处理成功、失败的结果
                // 调用 .then() 方法,传入两个函数类型的参数
                .then((res) => {
                    // 成功时候调用
                    alert('恭喜你中奖了,奖品为:一台iphone 12 pro max!您的号码为:' + res)
                }, (err) => {
                    // 失败时候调用
                    alert('再接再厉!您的号码为:' + err)
                })
        })
    </script>

</body>

</html>
  • 文件读取
const fs = require('fs')

// Promise 实现
function myReadFile(path) {
    // 翻译个 Promise 对象
    return new Promise((resolve, reject) => {
        fs.readFile(path, 'utf-8', (err, data) => {
            if (err) {
                reject(err)
                return
            }
            resolve(data)
        })
    })
}

myReadFile('./test2.txt').then(data => {
    console.log('成功', data);
}, err => {
    console.log('失败', err);
})

3、Promise 实例方法

.then()
// promise状态为fulfilled(已成功)
// 参数:函数,函数内部的参数是resolve传过来的实参
.catch()
// promise状态为rejected(已失败) 
// 参数:函数,函数内部的参数是reject传过来的实参
.finally()
// 无论promise状态是成功还是失败,都会执行里面的代码

4、Promise 的基本工作流程

在这里插入图片描述

  • Promise 构造函数接受一个函数作为参数,该函数的两个参数分别是 resolvereject ,它们是两个函数
    • 1、
      • resolve 作用是将 promise 对象状态从未完成变为成功,异步操作成功时调用,并将异步操作的结果作为参数传出去。
      • reject 作用是将 promise 的状态从未完成变为失败,在异步操作失败时调用,并将异步操作报的错作为参数传递出去
    • 2、
      • promise 对象代表一个异步操作有三个状态:pending 初始状态,fulfilled 操作成功,rejected 操作失败状态
    • 3、
      • promise 的状态一经改变,只有两种可能:从 pending 变为 fulfilled,从 pending 变为 rejected 状态发生改变之后就不会再变,会一直保持这个结果,这时就称为 resolved(已定型)

5、实例方法

  • 可以使用链式调用:因为这三个方法的返回值都是 promise 实例
.then()
// promise状态为fulfilled(已成功)
// 参数:函数,函数内部的参数是resolve传过来的实参
.catch()
// promise状态为rejected(已失败) 
// 参数:函数,函数内部的参数是reject传过来的实参
.finally()
// 无论promise状态是成功还是失败,都会执行里面的代码
  • 简单例子
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
        integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
    <script src="./test.js"></script>
</head>

<body>
    <div class="container">
        <h2 class="page-head">Promise 初体验</h2>
        <button type="button" class="btn btn-primary" id="btn">点击抽奖</button>
    </div>


    <script>
        const btn = document.getElementById('btn')
        btn.addEventListener('click', function () {
            // Promise 形式实现
            const p = new Promise((resole, reject) => {
                // resole:解决,函数类型的参数 - 异步任务成功的时候调用
                // reject:拒绝,函数类型的参数 - 异步任务失败的时候调用

                // Promise 可以包裹一个异步任务
                setTimeout(() => {
                    let n = Math.floor((Math.random() * 100) + 1)
                    if (n <= 30) {
                        // 成功 - 调用 resole   将 Promise 对象(p)的状态设置为 【成功】
                        resole(n)
                    } else {
                        // 失败 - 调用 reject  将 Promise 对象(p)的状态设置为 【失败】
                        reject(n)
                    }
                }, 1000)
            })
                // 处理成功、失败的结果
                // 调用 .then() 方法,传入两个函数类型的参数
                .then((res) => {
                    // 成功时候调用
                    alert('恭喜你中奖了,奖品为:一台iphone 12 pro max!您的号码为:' + res)
                })
                .catch(err => {
                    // 失败时候调用
                    alert('很遗憾,您没有中奖,您的号码为:' + err)
                })
                .finally(() => {
                    // 无论成功、失败都会调用
                    alert('抽奖结束')
                })

            console.log(p);
        })
    </script>

</body>

</html>

6、静态方法

Promise.all([pro1,pro2])
        // 将pro1和pro2包装成数组作为实参传递进去
        // 返回值:promise对象。结果 =》pro1,pro2都成功才成功,有一个失败就失败        
Promise.race([pro1,pro2])
        // 将pro1和pro2包装成数组作为实参传递进去
        // 返回值:promise对象。结果 =》pro1,pro2谁先回来就用谁都结果(无论成功或者失败)        
Promise.any([pro1,pro2])
        // 将pro1和pro2包装成数组作为实参传递进去
        // 返回值:promise对象。结果 =》pro1,pro2都失败才失败,有一个成功就成功        
Promise.resolve()
        // 参数:任意
        // 返回值:状态为fulfilled的promise对象        
Promise.reject()
        // 参数:任意
        // 返回值:状态为rejected的promise对象

7、asyncawait

  • async 函数是 generator 函数的语法糖,是ES6的异步编程解决方案
  • async await是对 promise 的优化,async await 是一种更优雅的写法,将异步的代码优化为了同步的写法

7.1、关键字

  • function 关键字前加上 async(异步) ​ 异步请求之前,加上 await(等待)

7.2、实例

async function findAll() {
    let res = await $.get('......');
    console.table(res.data)
  }

7.3、区别

  • 1、函数的前面多了一个 async 关键字。await 只能在 async 中使用。await 是阻塞的意思,就是暂停,你一起调用2个接口,第一个执行完,不输出结果,要等最第二个接口执行完,才返回这两个的结果。
  • 2、async 生成的结果是 promise 对象,asyncpromise 的终结版。

7.4、为什么使用 async/await 比较好?

  • async
    • async 是 ES7
    • async 语法使得代码简洁清晰,不需要写那么多的箭头函数,避免了代码嵌套
    • async 在接收上一个返回值为参数时,比较方便
  • Promise
    • Promise 是 ES6
    • Promise 主要用于异步任务,将异步的任务队列化,他主要解决了异步操作不小心就会进入回调地狱模式中,他将回调地狱的嵌套模式改为了链式调用模式,利于代码可读性和维护性。
    • Promise 不能在返回表达式的箭头函数中设置断点。如果你在 .then 代码块中设置断点,进入下一步的话,调试器不会跳到下一个 .then ,因为他只会跳过异步代码。
    • 简单例子:
	// 比如这样的场景,调用promise1,使用promise1的返回结果去调用promise2,然后使用两者的结果去调用promise3
const maskRequest = () =>{
    return promise1().then(res1=>{
        return promise2(res1).then(res2=>{
            return promise3(res1,res2)
        })
    })
}
  • 这样的操作会导致代码嵌套很多,不易与解读。
  • 使用 async/await 的话代码就变得异常的简单和直观
const maskRrequest =  async()=>{
    const res1 = await promise1()
    const res2 = await promoise2(res1)
    return await promise( res1 , res2 )    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/416799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EI会议征稿通知】2024年第三届生物医学与智能系统国际学术会议(IC-BIS 2024)

2024年第三届生物医学与智能系统国际学术会议&#xff08;IC-BIS 2024&#xff09; 2024 3rd International Conference on Biomedical and Intelligent Systems (IC-BIS 2024) 2024年第三届生物医学与智能系统国际学术会议&#xff08;IC-BIS 2024&#xff09; 将于2024年4月…

皇冠测评:网络电视盒子哪个品牌好?电视盒子排行榜

欢迎各位来到我们的测评频道&#xff0c;本期我们要分享的产品是电视盒子&#xff0c;因很多网友留言不知道网络电视盒子哪个品牌好&#xff0c;我们通过为期一个月的测评后整理了电视盒子排行榜&#xff0c;想买电视盒子的可以看看下面这五款产品&#xff0c;它们各方面表现非…

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

如何使用Windows系统电脑无公网ip远程桌面Ubuntu系统

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

吴恩达机器学习全课程笔记第四篇

目录 前言 P61-P68 激活函数 Softmax算法 P69-P73 Adam算法 更多类型的层 模型评估 P74-P79 偏差和方差 建立表现基准 学习曲线 偏差和方差与神经网络 前言 这是吴恩达机器学习笔记的第四篇&#xff0c;第三篇笔记请见&#xff1a; 吴恩达机器学习全课程笔记第…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

Fastadmin列表根据status或者固定条件来显示按钮的显示和隐藏

根据订单状态&#xff0c;显示“退款操作”按钮显示和隐藏 打开页面的js文件&#xff0c;在操作的这一列里面再加一个button按钮。也可以新起一列&#xff08;我在其他文章有写&#xff09;添加按钮。 row就是选中的这一些所有的数据。 {field: operate, title: __(Operate…

【c++】stack和queue模拟实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕stack和queue模拟 > 毒鸡汤&#xff1a;…

任务系统之API子任务

日常运维工作中有许多的任务要执行&#xff0c;例如项目发布/数据备份/定时巡检/证书更新/漏洞修复等等&#xff0c;大部分的任务都会有多个步骤共同完成&#xff0c;例如一个发布任务会有拉代码、编译、分发、通知等等步骤&#xff0c;而不同的任务可能还包含相同或相似的步骤…

web前端-html自定义列表

html 自定义列表 <!--有序列表 应用范围&#xff1a;试卷、问答--> <ol><li>Java</li><li>C</li><li>Python</li><li>C</li><li>VB</li> </ol><br><!--无序列表 应用范围&#xff1a…

【粉丝福利第一期】小 明

Q1 - 能否自我介绍下&#xff1f; 嗨&#xff0c;大家好&#xff0c;我是 小 明 &#xff08;小明java问道之路&#xff09;&#xff0c;互联网大厂后端研发专家&#xff0c;2022博客之星TOP3/博客专家/CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万…

Apache Paimon Append Queue表解析

a) 定义 在此模式下&#xff0c;将append table视为由bucket分隔的queue。 同一bucket中的每条record都是严格排序的&#xff0c;流式读取将完全按照写入顺序将record传输到下游。 使用此模式&#xff0c;无需特殊配置&#xff0c;所有数据都将作为queue进入一个bucket&…

单/双通道40V 350mA车规级LDO稳压器高集成电流感应调节

概述 PC8803具有高输入电压单低压差调节器&#xff08;PC8803SC01/PC8803SCO3&#xff09;/双通道低压差调节&#xff08;PC8803SC02/PC8803SC04&#xff09;&#xff0c;具有精确的电流感测&#xff0c;设计用于在宽输入电压范围内工作 从4.5V到40V。该设备具有45V负载转储电…

redis中的分布式锁(setIfAbsent)(expire)

目录 应用场景 代码实例1&#xff1a; 代码实例2&#xff1a; setIfAbsent&#xff1a; expire&#xff1a; 举例说明&#xff1a; 代码实例3&#xff1a; 代码实例4&#xff1a; 还是一个同事问的一个问题&#xff0c;然后闲着没事就记录下来了。多人操作同一个保单&a…

智能印刷工厂如何通过引入工业物联网网关实现生产流程的智能化升级-天拓四方

项目背景 某大型印刷企业&#xff0c;面临着市场竞争加剧、生产成本上升和客户对交货时间要求越来越高等多重挑战。为了保持竞争力&#xff0c;该企业决定通过引入工业物联网网关来升级其印刷工厂&#xff0c;实现智能化生产。 应用方案 该企业选择了一款功能强大的工业物联…

HTML+CSS+JS:花瓣登录组件

效果演示 实现了一个具有动态花朵背景和简洁登录框的登录页面效果。 Code <section><img src"./img/background.jpeg" class"background"><div class"login"><h2>Sign In</h2><div class"inputBox"…

算法——滑动窗口之最大连续1的个数、将x减到0的最小操作数、水果成篮

3.最大连续1的个数 题目:. - 力扣&#xff08;LeetCode&#xff09; 题目要求的是给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 按照题目正面去做,还要替换0,很麻烦 反正我们最后要求的是最长…

c++学习记录 deque容器—插入和删除

1、函数原型 1.1 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据push_front(elem); //在容器头部插入一个数据pop_back(); //删除容器最后一个数据pop_front(); //删除容器第一个数据 1.2 指定…

【Python笔记-设计模式】备忘录模式

一、说明 备忘录模式是一种行为设计模式&#xff0c;允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 (一) 解决问题 主要解决在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要时恢复对象…

Restful风格解释

示例对比 传统风格开发 Restful风格开发 结论&#xff1a; 传统风格开发中&#xff0c;前端不同操作使用不同的url来访问后端&#xff0c;使得访问变得麻烦restful风格中&#xff0c;前端使用相同的url来访问后端&#xff0c;但是用数据传送方式进行区分&#xff08;get为请求…