异步编程解决方案 Promise

news2024/12/24 8:33:40

1. 回调地狱
2. Promise 的使用
3. Promise 的状态
4. Promise 的结果
5. Promise 的 then 方法
6. Promise 的 catch 方法
7. 回调地狱的解决方案

1. 回调地狱


回调地狱: 在回调函数中嵌套回调函数

因为 ajax 请求是异步的,所以想要使用上一次请求的结果作为请求参数,所以必须在上一次请求的回调函数中执行下次请求,这种写法非常繁琐,我们亲切的把它称之为 回调地狱

ES6 原生提供了 Promise 对象,Promise 解决了回调地狱的问题

回调地狱代码示例:

 
  1. // 第一次请求
  2. $.ajax({
  3. url: './login.json',
  4. success(res) {
  5. // 使用第一次请求的结果发送第二次请求
  6. $.ajax({
  7. url: './user.json',
  8. data: { id: res.id },
  9. success(res) {
  10. // 使用第二次请求的结果发送第三次请求
  11. $.ajax({
  12. url: './getUserList.json',
  13. data: { where: res.userinfo.name },
  14. success(res) {
  15. console.log('res', res)
  16. }
  17. })
  18. }
  19. })
  20. }
  21. })

2. Promise 的使用


Promise 是一个构造函数,接受一个函数作为参数,通过 new 关键字实例化

 
  1. new Promise((resolve, reject) => { });

查看 Promise 实例的属性

 
  1. const promise = new Promise((resolve, reject) => { });
  2. console.dir(promise);

得出 Promise 实例有两个属性: state(状态),result(结果)

3. Promise 的状态


Promise 实例的三种状态

 
  1. pending (准备,待解决,进行中)
  2. fulfilled(已完成,成功)
  3. rejected (已拒绝,失败)

Promise 状态的改变:

通过调用 resolve(),reject() 改变当前 promise 对象的状态,promise 对象的状态改变是一次性的。

 
  1. const promise = new Promise((resolve, reject) => {
  2. // 使当前 promise 对象状态改为 fulfilled
  3. // resolve()
  4. // 使当前 promise 对象状态改为 rejected
  5. // reject()
  6. });

4. Promise 的结果


Promise 实例的另外一个属性 result 的值就是调用 resolve() 或 reject() 的参数

 
  1. const promise = new Promise((resolve, reject) => {
  2. resolve({ name: 'liang' })
  3. });
  4. console.dir(promise);
  5. const promise2 = new Promise((resolve, reject) => {
  6. reject({ name: 'wang' })
  7. });
  8. console.dir(promise2);

5. Promise 的 then 方法


then 方法是第一个参数在 promise 状态是 fulfilled 执行,第二个参数在 promise 状态是 rejected 执行

then 方法的返回值是一个 promise 对象

 
  1. const p = new Promise((resolve, reject) => {
  2. reject({ name: 'liang' })
  3. });
  4. p.then(res => {
  5. // 当 promise 状态是 fulfilled 执行
  6. console.log('成功时调用', res)
  7. }, reason => {
  8. // 当 promise 状态是 rejected 执行
  9. console.log('失败时调用', reason)
  10. });

在 then 方法中使用 return 可以将 then 方法返回的 promise 实例改为 fulfilled 状态

在 then 方法中,如果代码出错(错误异常),会将返回的 promise 实例状态改为 rejected

 
  1. // 如果 promise 的状态不改变 then 方法无法执行
  2. const p = new Promise((resolve, reject) => {
  3. resolve()
  4. });
  5. const t = p.then(res => {
  6. console.log('成功时调用', res)
  7. // 在 then 方法中使用 return 可以将 then 方法返回的 promise 实例状态改为 fulfilled
  8. // return 123
  9. // 如果这里的代码出错 会将 t 实例的状态改为 rejected
  10. console.log(a);
  11. }, reason => {
  12. console.log('失败时调用', reason)
  13. });
  14. t.then(res => {
  15. // res 123
  16. console.log('t 成功', res)
  17. }, reason => {
  18. console.log('t 失败', reason)
  19. })

6. Promise 的 catch 方法


catch 方法参数中的函数执行时机 ?

1. 当 promise 实例状态改为 rejected 时
2. promise 构造函数的参数方法体中有错误发生(其实也是状态变为 rejected )

 
  1. const p = new Promise((resolve, reject) => {
  2. // 下面两种错误都会触发 catch 方法
  3. // reject('有错误')
  4. // throw new Error('出错了')
  5. });
  6. p.catch(res => {
  7. console.log('res', res)
  8. })

catch 方法 和 then 方法的第二个参数都能捕捉到 promise 实例状态改为 rejected 时的情况,那么平时推荐怎么用 ?下面是 Promise 最常见的写法,推荐这么使用

 
  1. const p = new Promise((resolve, reject) => {
  2. resolve()
  3. // reject()
  4. });
  5. p.then(res => {
  6. console.log('res', res)
  7. }).catch(reason => {
  8. console.log('reason', reason)
  9. })

7. 回调地狱的解决方案


回调地狱写法

第一次改造: 使用 Promise

第二次改造: 封装函数

第三次改造: 终极解决方案(使用 async + await)

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

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

相关文章

ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-BF53x 处理器上集成了一个实时时钟(RTC)模块,板卡上设计了一个专门用于 RTC 时钟源的晶体32.7…

如何修复错误:无法下载 metadata repo appstream

如何修复错误:无法下载 metadata repo appstream 如果您出于某种原因仍在积极使用CentOS 8,您可能在尝试更新系统或只是安装软件包时遇到以下错误。 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No …

Linux内存管理

平时我们说计算机的“计算”两个字,其实说的就是两方面,第一,进程和线程对于CPU的使用;第二,对于内存的管理。——这个是对计算机的理解的两个大方面,面试中问到的场景设计题可以尝试从这两个角度出发。 可…

Gradle学习笔记之项目生命周期及settings文件

文章目录Gradle项目的生命周期settings文件Gradle项目的生命周期 Gradle项目的生命周期分为初始化->配置->执行三步,如下图所示: 初始化阶段主要目的是初始化构建,分为执行初始化脚本和执行设置脚本两步,前者在每个项目构…

多线程的实现

目录 进程和线程 并发和并行 继承实现Runnable接口的Thread类实现的多线程 实现Runnable接口创建线程类 线程常用方法 进程和线程 进程:一个程序的启动就可以抽象化为一个进程 线程:线程是由进程开启的,一个进程可以创建多个线程&#x…

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

文章很长,而且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

基于jsp+mysql+ssm项目bug修复管理系统-计算机毕业设计

项目介绍 本文主要是采用ssm的mvc技术、Mysql数据库、Tomcat服务器作为开发平台,系统采用B/S结构进行开发,完成一个项目修复管理系统,构建企业管理与员工任务计划相结合。提供了包括传统业务中最基本的用户注册、登录、查询、职位信息、部 门…

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动 1. 新主角登场 手上有块8x8LED点阵屏,咱们已经了解了点阵屏的基础电路与驱动原理,并用两片74HC595锁存IC成功驱动点阵屏显示需要的图案。 MicroPython-On-ESP8266…

DBCO-PEG-CHO,DBCO-CHO,二苯基环辛炔-聚乙二醇-醛基

一、理论分析: 中文名:二苯基环辛炔-聚乙二醇-胆固醇,胆固醇偶联二苯基环辛炔, 二苯基环辛炔-聚乙二醇-醛基,点击试剂DBCO偶联醛基 英文名:DBCO-PEG-CHO; DBCO-CHO 二、结构式: 三…

【JavaEE】B/S结构系统的会话机制_session机制

session机制什么是会话?session机制为什么需要session对象来保存会话状态呢?只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?为什么不使用request(ServletRequest)对象保存会话状态?为什么不使用appl…

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载,其中下载的过程支持断点续传。服务器上有热点管理模块,将非热点文件进行压缩存储,节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们,今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法,循环遍历列表时使用else语句。下面举个例子,比如我们想检查一个列表中是否包…

DNSPod十问陈迪菲:从C到B,鹅厂设计师的中场战事

陈迪菲,腾讯云设计中心总经理,公司设计通道副会长,设计技术委员会委员,腾讯学院优秀讲师,曾于2019年获得新中国成立70周年中国用户体验设计70人提名奖。2010年加入腾讯,10年设计团队项目管理经验&#xff0…

C++手机运动信息管理系统

C手机运动信息管理系统 《程序设计基本能力综合实训》 实训案例名称:手机运动信息管理系统 -----说明文档 本案例主要完成手机运动信息的管理。主要功能包括:用户信息的管理、运动信息的管理、查看运动排行榜、定制运动路线、数据文件操作和退出。 如图 1-1 所示。 图1-1 …

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

初始C语言2【函数 、数组、操作符、关键字、#define 定义常量和宏、指针、结构体】

目录 八、函数 九、数组 1、数组的定义:一组相同类型元素的集合 2、数组的下标 数组的每个元素都有一个下标,下标是从0开始的。 数组可以通过下标来访问元素。 3、数组的使用 十、操作符 1.常见操作符: 举例: 1&#xff…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例,介绍与图相关的各种矩阵。我们定义下面的图为 GGG: import networkx as nx import matplo…

CSS之背景样式及边框样式

1、背景样式 常用属性: background-color:背景颜色background-image:背景图片background-repeat:背景图片的平铺方式background-position:背景图片的位置background-attachment:背景图随滚动条的移动方式 …

ADI Blackfin DSP处理器-BF533的开发详解19:LAN的网口设计(含源代码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 BF533说实话用来做LAN的应用有些许勉强,因为他自己不带网口,要做的话,需要在总线上挂,那…

3D视觉PnP问题

文章目录背景和定义方法分类典型方法P3P(角锥法)DLT单应性矩阵分解迭代法EPnP其他延伸总结背景和定义 目前常用的pnp方法有很多,但是本人学习和查阅后发现比较零散,因此,在这里将所学习的方法按照理解分类和总结,并且…