Promise 讲解,js知识,es6

news2025/1/13 13:42:12

文章目录

  • 一、Promise的三种状态
    • 1. 初始态pending
    • 2. 成功态fulfilled,调用resolve方法
    • 3. 失败态rejected,调用reject方法
  • 二、Promise的方法
    • then方法
    • catch方法
  • 三、async和await
    • async 函数
    • await 表达式
  • 四、代码举例帮助理解
    • 1、Promise的值通过then方法获取
    • 2、reject的值通过catch方法获取
    • 3、Promise得到状态之后,状态不可改变
    • 4、then和catch方法执行之后会返回一个相同状态值为fulfilled(成功)的Promise对象
    • 5、then方法的返回值会进入到Promise对象中的PromiseResult
    • 6、then方法的连续调用
    • 7、Promise对象可以反复使用,调用then方法并不会改变对象本身
    • 8、让then和catch方法返回一个resolved(错误)状态的Promise对象
    • 封装ajax请求
  • 参考文档

一、Promise的三种状态

1. 初始态pending

  • pending。它的意思是 “待定的,将发生的”,相当于是一个初始状态。创建Promise对象时,且没有调用resolve或者是reject方法,相当于是初始状态。这个初始状态会随着你调用resolve,或者是reject函数而切换到另一种状态。

2. 成功态fulfilled,调用resolve方法

  • resolved。表示解决了,就是说这个承诺实现了。 要实现从pending到resolved的转变,需要在 创建Promise对象时,在函数体中调用了resolve方法(即第一个参数)。

3. 失败态rejected,调用reject方法

  • rejected。拒绝,失败。表示这个承诺没有做到,失败了。要实现从pending到rejected的转换,只需要在创建Promise对象时,调用reject函数。

在这里插入图片描述

二、Promise的方法

then方法

  • 在then方法的参数函数中,通过形参使用Promise对象的结果
  • then方法返回一个新的Promise实例,状态是pending
  • 在then方法中,通过return将返回的Promise实例改为fulfilled状态
  • 在then方法中,出现代码错误,将返回的Promise实例改为rejected状态

catch方法

  • 当Promise的状态改为rejcted.被执行
  • 当Promise执行过程出现代码错误时,被执行

三、async和await

async 函数

  • 函数的返回值为 promise 对象
  • promise 对象的结果由 async 函数执行的返回值决定

await 表达式

  • await 右侧的表达式一般为 promise 对象, 但也可以是其它的值
  • 如果表达式是 promise 对象, await 返回的是 promise 成功的值
  • 如果表达式是其它值, 直接将此值作为 await 的返回值

四、代码举例帮助理解

1、Promise的值通过then方法获取

const firstPromise001 = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
})
firstPromise001.then((res)=>{
    console.log('resolve中的值为='+res)
})

在这里插入图片描述

const firstPromise002 = new Promise((resolve,reject)=>{
    reject("这是我的失败状态")
})
firstPromise002.then((res)=>{
    console.log('resolve(正确)中的值为='+res)
},(err)=>{
    console.log('reject(错误)中的值为='+err)
})

在这里插入图片描述

2、reject的值通过catch方法获取

  • 只能获取rejected状态的值
const firstPromise001 = new Promise((resolve,reject)=>{
    reject("这是我的失败状态")
})
firstPromise001.catch((err)=>{
    console.log('reject中的值为='+err)
})

在这里插入图片描述

3、Promise得到状态之后,状态不可改变

a=0
const firstPromise = new Promise((resolve,reject)=>{
    a++
    //状态不能改变,执行了resolve方法之后状态就确定了。
    //但是不代表执行了resolve之后,方法就结束了,reject也会正常执行(不会报错),只不过是无效执行而已,所以控制台的a=3
    resolve("这是我的成功状态")
    a++
    reject("这是我的失败状态")
    a++
})
console.log(firstPromise)
console.log(a)

在这里插入图片描述

4、then和catch方法执行之后会返回一个相同状态值为fulfilled(成功)的Promise对象

  • 无论是什么状态的Promise对象都能调用then方法,但是只有rejected(失败)状态的才能调用catch方法
  • 作者为什么要探究这个呢?因为 then方法返回的对象是一个状态为fulfilled(成功)的Promise,所以then方法调用结束之后可以继续调用then方法。但是catch不行,catch方法结束之后只能调用then方法,不能调用catch方法,因为调用catch方法的条件是状态为rejected(失败)。
const thenPromise = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
}).then((res)=>{
    console.log('resolve中的值为='+res)
})
const catchPromise = new Promise((resolve,reject)=>{
    reject("这是我的失败状态")
}).catch((err)=>{
    console.log('reject中的值为='+err)
})
console.log(thenPromise)
console.log(catchPromise)

在这里插入图片描述

5、then方法的返回值会进入到Promise对象中的PromiseResult

const firstPromise = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
}).then((res)=>{
    console.log('第一次then输出的状态='+res)
    return "第一次调用then的返回";
})

在这里插入图片描述

6、then方法的连续调用

const firstPromise = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
}).then((res)=>{
    console.log('第一次then输出的状态='+res)
    return "第一次调用then的返回";
}).then((res)=>{
    console.log('第二次then输出的状态='+res)
    return "北京"
}).then((res)=>{
    console.log('第三次then输出的状态='+res)
})

在这里插入图片描述

7、Promise对象可以反复使用,调用then方法并不会改变对象本身

const firstPromise = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
})

console.log(firstPromise)

firstPromise.then((res)=>{
    console.log('resolve中的值为='+res)
})
firstPromise.then((res)=>{
    console.log('resolve中的值为='+res)
})
firstPromise.then((res)=>{
    console.log('resolve中的值为='+res)
})

console.log(firstPromise)

在这里插入图片描述

8、让then和catch方法返回一个resolved(错误)状态的Promise对象

  • 错误信息会封装到Promise对象中的PromiseResult
const firstPromise = new Promise((resolve,reject)=>{
    resolve("这是我的成功状态")
}).then((res)=>{
    throw new Error('作者用于测试的程序错误')
    console.log('第一次then输出的状态='+res)
    return "第一次调用then的返回";
})

console.log(firstPromise)

firstPromise.catch((err)=>{
    console.log('把错误信息打印到控制台='+err)
})

在这里插入图片描述

封装ajax请求

// 封装ajax请求
function getData(url, data = {}){
	return new Promise((resolve, reject) => {
  	$.ajax({
      // 发送请求类型
    	type: "GET",
      url: url,
      data: data,
      success: function (res) {
      	// 修改Promise状态为成功, 修改Promise的结果res
        resolve(res)
      },
      error:function (res) {
      	// 修改Promise的状态为失败,修改Promise的结果res
        reject(res)
      }
    })
  }
}

// 调用函数
getData("data1.json")
  .then((data) => {
  	// console.log(data)
    const { id } = data
    return getData("data2.json", {id})
  })
  .then((data) => {
  	// console.log(data)
    const { usename } = data
    return getData("data3.json", {usename})
  })
  .then((data) => {
  	console.log(data)
  })

参考文档

  • Promise的三种状态
  • Promise

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

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

相关文章

【idea】编译热部署

项目场景: 实际工作中,用到了idea,发现idea不编译代码,热部署什么的都不行 问题描述 在实际的工作中idea遇到了各种问题,之前一直用的2022版的,公司用的jboss起的项目,启动过程极其痛苦&#…

电子档案管理系统

电子文档 登陆成功后点击左上角“”选择“档案管理”跳转到“档案管理首页”如下图: 该界面列出用户被授权查看的可视化数据图形,柱图、饼图、线图、雷达图等,并结合数据仓库里的动态数据进行数据展现。 图形所展示的数据可根据企业需求定制,点击图形即可查看关联内容,方…

C++类与对象(上部曲)

目录 面向过程和面向对象初步认识 类的引入 类的定义 类的两种定义方式: 1. 声明和定义全部放在类体中 2. 类声明放在.h文件中,成员函数定义放在.cpp文件中 类的访问限定符及封装 1 访问限定符 2 封装 类的实例化 类对象的存储方式 this指针 …

IDEA快速创建SpringBoot

文件具有错误的版本 61.0, 应为 52.0报错可以看看是不是Springboot的版本比较高 和jdk版本不匹配 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframewor…

黑马 pink h5+css3+移动端前端

网页概念 网页是网站的一页,网页有很多元素组成,包括视频图片文字视频链接等等,以.htm和.html后缀结尾,俗称html文件 HTML 超文本标记语言,描述网页语言,不是编程语言,是标记语言,有标签组成 超文本指的是不光文本,还有图片视频等等标签 常用浏览器 firefox google safari…

从Vue2到Vue3【四】——Composition API(第四章)

系列文章目录 内容链接从Vue2到Vue3【零】Vue3简介从Vue2到Vue3【一】Composition API(第一章)从Vue2到Vue3【二】Composition API(第二章)从Vue2到Vue3【三】Composition API(第三章)从Vue2到Vue3【四】C…

os.environ[“CUDA_VISIBLE_DEVICES“]学习总结

今天发现一个很有意思的东西 import torch import os # Specify the GPU device os.environ["CUDA_VISIBLE_DEVICES"] "1" print(torch.cuda.is_available())但是如果修改下面的设置后,结果就变成了 import torch import os # Specify the…

【100天精通python】Day7:数据结构_列表 List的创建、删除、访问、遍历、统计、排序、推导等使用

目录 1 列表的创建 2 列表的删除 3 访问列表元素 4 遍历列表 5 添加修改删除列表元素 6 对列表进行统计和计算 7 对列表进行排序 8 列表推导式 9 多维列表 在Python中,列表是一种有序的可变数据类型,用于存储一组元素。 列表使用方括号“[] ”来…

汇编习题1-100和

.text .globl _start_start:mov r0,#0MOV r1,#0stop:cmp r1,#0x64addcc r1,r1,#0x1addcc r0,r0,r1b stop .end运行结果: 寄存器R0就为16进制的结果

K8S初级入门系列之四-Namespace/ConfigMap/Secret

一、前言 本章节我们继续学习Namespace、ConfigMap、Secret基础概念,了解他们基本用法和操作。NameSpace为命名空间,在同一集群中试下资源隔离。ConfigMap通过key-value的方式实现明文配置数据的保存,Secret与ConfigMap类似,不过是…

Windows下使用rocketMq

1、下载(下载zip后解压即可) 下载地址:下载 | RocketMQ 2、配置环境变量(注意:该目录的下一级是bin) 3、启动 在bin目录下使用cmd 分别输入 3.1 启动name server (下图是启动成功的显示,窗口…

CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、CPU密集型与IO密集型3.1、CPU密集型3.2、I/O密…

dp算法 力扣978、力扣139、力扣467

目录 一、力扣978978. 最长湍流子数组 - 力扣(LeetCode) (一)题目详情 (二)算法讲解 (三)代码 二、力扣139139. 单词拆分 - 力扣(LeetCode) &#xff0…

计网学习笔记 wireless mobile networks

无线局域网的组成 无线网络在近些年来一直是个非常流行的东西。现在的移动用户数量已经大大超过了有线用户数量,比例大于5:1。 实现无线网络的挑战性 从有线到无线是网络构建上一个伟大的设想,挑战性主要集中在wireless和mobility两个点上。 这两个是…

Express 框架的基本操作

目录 1、应用生成器 2、基本路由 2.1、在跟路由下配置 GET请求,返回对应相应内容。 2.2、在跟路由下配置 POST请求,返回对应相应内容。 2.3、在跟路由下配置 PUT请求,返回对应相应内容。 2.4、在根路由下配置DELETE请求,返回对…

【剑指offer】学习计划day4

目录 一. 前言 二.数组中重复的数字 a.题目 b.题解分析 c.AC代码 三.在排序数组中查找数字 I a.题目 b.题解分析 c.AC代码 四.0~n-1中缺失的数字 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下…

学习系统编程No.32【线程互斥实战】

引言: 北京时间:2023/7/19/15:22,昨天更新完博客,和舍友下了一会棋,快乐就是这么简单,哈哈哈!总体来说,摆烂程度得到一定的改善,想要达到以前的水准,需要一定…

分布式 - 消息队列Kafka:Kafka分区常见问题总结

文章目录 01. Kafka 的分区是什么?02. Kafka 为什么需要分区?03. Kafka 分区有什么作用?03. Kafka 为什么使用分区的概念而不是直接使用多个主题呢?04. Kafka 分区的数量有什么限制?05. Kafka 分区的副本有什么作用&am…

[内网渗透]XXE-vulnhub

文章目录 [内网渗透]XXE-vulnhub环境安装信息收集解题步骤总结 [内网渗透]XXE-vulnhub 环境安装 首先在 vulnhub 下载文件: 将其解压为ovf格式: 使用vmware打开,新建一个虚拟机,然后开机,环境就搭好了 信息收集 由于…

【仿写spring】一、通过反射读取带有@RequestMapping与@Controller注解的类并模拟请求路径调用方法

目录 简介思路实践一、自定义注解RequestMapping,Controller二、路径转全限定名方法三、扫描文件夹四、通过反射来寻找有RequestMapping以及Controller的类五、获取对象实例六、通过invoke调用方法 文件结构以及测试结果1、文件结构2、TestController3、测试结果 简…