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

news2024/9/29 15:21:48

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 比较好?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NUS神经网络生成我感觉解读过于夸大了

网上对其解读有点过了&#xff0c;只是合成了最后标准化层的参数&#xff0c;或者是更多的其他层参数。而不是网络结构。对于新任务下的网络结构以及参数如何生成&#xff0c;应该是做不到的&#xff0c;论文意义有限。 论文片段&#xff1a;我们提出了神经网络扩散&#xff0…

数据可视化引领智慧仓储新时代

随着科技的飞速发展&#xff0c;数据可视化已然成为智慧仓储领域的璀璨明珠&#xff0c;其强大的功能和多面的作用让智慧仓储焕发出勃勃生机。让我们一同探索&#xff0c;数据可视化究竟在智慧仓储中起到了怎样的作用。下面我就以可视化从业者的角度来简单谈谈这个话题。 在这…

【练习——打印每一位数】

打印一个数的每一位 举个例子&#xff1a;我们现在要求打印出123的每一位数字。我们需要去想123%10等于3&#xff0c;就可以把3单独打印出来了&#xff0c;然后再将123/10可以得到12&#xff0c;将12%10就可以打印出2&#xff0c;而我们最后想打印出1&#xff0c;只需要1%10就…

数据隐私安全趋势

在当今社交媒体和开源开发的世界中&#xff0c;共享似乎已成为社会常态。毕竟&#xff0c;我们都被教导分享就是关怀。这不仅适用于个人&#xff0c;也适用于公司&#xff1a;无论是有意在社交媒体帐户和公司网站上&#xff0c;还是无意中通过员工的行为&#xff0c;公司可能会…

树莓派使用git clone时报错failed: The TLS connection was non-properly terminated.

fatal: unable to access https://github.com/jacksonliam/mjpg-streamer.git/: gnutls_handshake() failed: The TLS connection was non-properly terminated. 原因&#xff1a;权限不足 解决办法&#xff1a;sudo git clone 加对应网址。 sudo git clone https://github.co…

golang gin单独部署vue3.0前后端分离应用

概述 因为公司最近的项目前端使用vue 3.0&#xff0c;后端api使用golang gin框架。测试通过后&#xff0c;博文记录&#xff0c;用于备忘。 步骤 npm run build&#xff0c;构建出前端项目的dist目录&#xff0c;dist目录的结构具体如下图 将dist目录复制到后端程序同级目录…

排序(9.17)

1.排序的概念及其运用 1.1排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性 &#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记…

网络安全与信创产业发展:构建数字时代的护城河

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

CMU15445实验总结(Spring 2023)

CMU15445实验总结(Spring 2023) 背景 菜鸟博主是2024届毕业生&#xff0c;学历背景太差&#xff0c;导致23年秋招无果&#xff0c;准备奋战春招。此前有读过LevelDB源码的经历&#xff0c;对数据库的了解也仅限于LevelDB。奔着”有对比才能学的深“的理念&#xff0c;以及缓解…

Java之SpringMVC源码详解

SpringMVC源码 一、SpringMVC的基本结构 1.MVC简介 以前的纯Servlet的处理方式&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String type req.getParameter(Constant.REQUEST_PA…

Scrapy实战

代码&#xff1a; Spider import scrapy from urllib.parse import urljoin from scrapy import Requestclass JiaSpider(scrapy.Spider):name "jia"allowed_domains ["desk.zol.com.cn"]start_urls ["https://desk.zol.com.cn/dongman/"]d…

【kubernetes】二进制部署k8s集群之cni网络插件flannel和calico工作原理

k8s集群的三种接口 k8s集群有三大接口&#xff1a; CRI&#xff1a;容器进行时接口&#xff0c;连接容器引擎--docker、containerd、cri-o、podman CNI&#xff1a;容器网络接口&#xff0c;用于连接网络插件如&#xff1a;flannel、calico、cilium CSI&#xff1a;容器存储…

C# 学习第三弹——表达式

表达式操作数运算符 &#xff08;一&#xff09;算数运算符 错误例子&#xff1a;这不是python&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 正确结果&a…

【Flutter/Android】新建项目,打开android 目录,报错红色以及开启 MultiDex 配置

1 报错红色问题。 单独打开 Flutter 项目下的 android 项目即可。 也就是说&#xff0c;你要一部分原生代码开发&#xff0c;你就需要自己把 android 项目单独出去做&#xff08;其实就相当于android 项目引用 Flutter的dart部分&#xff09;。也就是说&#xff0c;在 Flutter…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的&#xff0c;有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关&#xff0c;区别就是如果最后的输出只和当前状态有关而与输入无关&#xff0c;则是moore型状态机。如果最后的输出不…

文件对比工具Beyond Compare 4 mac v4.4.7(28397)中文版

Beyond Compare是一款适用于Windows、Mac OS X和Linux平台的文件和文件夹比较工具。它可以帮助用户比较和同步文件夹、文件和压缩包等内容&#xff0c;支持多种文件格式&#xff0c;如文本、图像、音频、视频等。 软件下载&#xff1a;Beyond Compare 4 mac v4.4.7(28397)中文版…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

NVIDIA\CUDA\cudnn安装以及visual studio2022编译安装ceres2.2.0库

一、NVIDIA驱动安装 网址:官方驱动 | NVIDIA 因为本文之后需要visual studio2022进行编译&#xff0c;所以在安装NVIDIA\CUDA\cudnn之前你先得安装visual studio2022 点击NVIDIA控制面板&#xff0c;NVIDIA Control Panel 查看产品家族 根据产品家族选择驱动&#xff0c;点…

SpringBoot使用classfinal-maven-plugin插件加密Jar包

jar包加密 1、在启动类的pom.xml中加入classfinal-maven-plugin插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><…

CleanMyMac4苹果Mac电脑全面、高效的系统清理工具

CleanMyMac 4 for Mac是一款专为Mac用户设计的系统清理和优化工具。它具备多种功能&#xff0c;旨在帮助用户轻松管理和释放Mac上的磁盘空间&#xff0c;同时提升系统性能。 系统垃圾清理&#xff1a;CleanMyMac 4能够深入扫描Mac的每一个角落&#xff0c;智能识别并清除不需要…