异步编程Promise

文章目录

  • 前言
  • 一、关于 Promise 的理解与使用
    • 1.相关知识补充
      • 区别实例对象和函数对象
      • 同步回调
      • 异步回调
      • Js中的错误(error)和错误处理
    • 2.promise是什么
  • 二、Promise 原理
  • 三、Promise 封装 Ajax
  • 四、async 与 await
  • 总结


前言

在项目中,promise的使用是必不可少的,本文主要记录了异步编程中promise,async 与 await相关知识。


一、关于 Promise 的理解与使用

1.相关知识补充

区别实例对象和函数对象

  • 实例对象:通过 new 创建的对象,称实例对象。
  • 函数对象:将函数作为对象使用时,简称函数对象。

同步回调

  • 立即执行,全部执行完了才结束,不放入回调队列中。
  • 如:数组遍历相关的回调函数(promise的excutor函数)new Promise(executor)

异步回调

  • 不会立即执行,会放入回调队列中,以后执行。
  • 如:定时器回调、Ajax回调、promise 的成功/失败回调。

Js中的错误(error)和错误处理

1.错误类型

  • Error:所有错误的父类型
  • ReferenceError:引用的变量不存在
  • TypeError:数据类型不正确
  • RangeError:数据值不在其所允许的范围内
  • SyntacticError:语法错误

2.错误处理

  • 捕获错误:try{ } catch(){ }
  • 抛出错误:throw error

3.错误对象

  • message 属性:错误相关信息
  • stack属性:记录信息

2.promise是什么

1.简介

  • promise 是一个ES6语法,专门用来解决异步 回调地狱 的问题。
  • promise 规范规定了一种异步编程解决方案的API。规范规定了promise对象的状态和then方法。
  • promise 是一个内置的构造函数,是程序员自己new 调用的。
  • promise 对象用来封装一个异步操作,并可以获取其成功/失败的结果值。

回调地狱

  • 当一个回调函数嵌套一个回调函数的时候,出现一个嵌套结构,嵌套多了就会出现回调地狱的情况。

2.语法

  • Promise.prototype.then 方法
  • new Promise(executor) 构造函数
  • new Promise的时候,传入一个回调函数,它是同步的回调,会立即在主线程上执行,称为executor函数
  • executor 会接收两个参数:resolve, reject
  • (1)调用 resolve,会让promise实例状态变为:成功(fulfilled),同时可以指定成功的 value。
    (2)调用 reject,会让promise实例状态变为:失败(rejected),同时可以指定失败的 reason

const p = new Promise((resolve, reject) => {resolve('ok')})
console.log('@',p)//demo,一般不在控制台输出,

一个 Promise 必然处于以下几种状态之一:

  • pending:初始状态,既没有被兑现,也没有被拒绝。
  • fulfilled:意味着操作成功完成。
  • rejected:意味着操作失败。
const p = new Promise((resolve, reject) => {
	setTimeout(() => {
	rejected('test错误信息')
  	resolve('test成功数据');
  }, 1000);
});

p.then(
	data => console.log('成功', 'resolve', data),//成功
  data => console.log('失败', 'reject', data)//失败
);

// 执行结果
1s后打印 `成功 "resolve" "test成功数据"`

二、Promise 原理

-Promise 对象被创建时,它处于 pending 状态。当异步操作成功完成时,它变为 fulfilled 状态;当异步操作失败时,它变为 rejected 状态。而且一旦状态改变,就不能再改变。
当其中任意一种情况发生时,通过 Promise 的 then 方法串联的处理程序将被调用。如果绑定相应处理程序时 Promise 已经兑现或拒绝,这处理程序将被立即调用,因此在异步操作完成和绑定处理程序之间不存在竞态条件。

如果一个 Promise 已经被兑现或拒绝,即不再处于待定状态,那么则称之为已敲定(settled)。

Promise 提供了统一的 API ,各种异步操作都可以用同样的方法进行处理。这使得代码更加简洁和易于理解。
在这里插入图片描述

三、Promise 封装 Ajax

function fetchData(url) {  
  return new Promise((resolve, reject) => {  
    // 创建一个 XMLHttpRequest 对象  
    let xhr = new XMLHttpRequest();  
  
    // 监听请求完成事件  
    xhr.addEventListener('load', function() {  
      if (xhr.status === 200) { // 请求成功  
        // 将返回的数据作为 Promise 的结果  
        resolve(xhr.responseText);  
      } else { // 请求失败  
        // 将错误信息作为 Promise 的结果  
        reject(new Error(`Request failed with status ${xhr.status}`));  
      }  
    });  
  
    // 监听请求错误事件  
    xhr.addEventListener('error', function() {  
      reject(new Error('Request failed'));  
    });  
  
    // 发送请求  
    xhr.open('GET', url, true);  
    xhr.send();  
  });  
}

四、async 与 await

  • Promise虽然解决了回调地狱问题,但是缺点是有不少的样板代码,并且写代码时候还是通过then注册回调方式

  • async、await是语法糖,async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为。


总结

  1. promise 常用语法:Promise.prototype.then、new Promise(executor)
  2. promise 三种状态:pending、resolve、 reject

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

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

相关文章

数据可视化---直方图

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

使用阿里云性能测试工具 JMeter 场景压测 RocketMQ 最佳实践

作者:森元 需求背景 新业务上线前,我们通常需要对系统的不同中间件进行压测,找到当前配置下中间件承受流量的上限,从而确定上游链路的限流规则,保护系统不因突发流量而崩溃。阿里云 PTS 的 JMeter 压测可以支持用户上…

Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现

Apache Tomcat httpoxy 安全漏洞 CVE-2016-5388 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用修复建议 总结 漏洞名称 漏洞描述 在Apache Tomcat中发现了一个被归类为关键的漏洞,该漏洞在8.5.4(Application Server Soft ware)以下。受影响的是组…

【科技前沿】数字孪生技术改革智慧供热,换热站3D可视化引领未来

换热站作为供热系统不可或缺的一部分,其能源消耗对城市环保至关重要。在双碳目标下,供热企业可通过搭建智慧供热系统,实现供热方式的低碳、高效、智能化,从而减少碳排放和能源浪费。通过应用物联网、大数据等高新技术,…

PaddleOCR Docker 容器快捷调用,快捷调用OCR API

文章目录 搞环境命令行测试Python调用测试转fastapi服务打包成镜像服务快速启动paddleOCR paddleOCR迎来大更新,搞一把新的api接口,直接用起来。 搞环境 搞容器: FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 ENV DEBIAN_FRONTENDno…

亚马逊云科技-如何缩容/减小您的AWS EC2根卷大小-简明教程

一、背景 Amazon EBS提供了块级存储卷以用于 EC2 实例,EBS具备弹性的特点,可以动态的增加容量、更改卷类型以及修改预配置的IOPS值。但是EBS不能动态的减少容量,在实际使用中,用户也许会存在此类场景: 在创建AWS EC2…

CleanMyMac X2024(Mac清理工具) 4.15苹果MAC电脑版

CleanMyMac X中文2024版是一款mac系统清理垃圾软件,CleanMyMac已经完成了向全面清理,优化和管理工具的转变。它的算法和功能变得更加智能,但外观仍然像您预期的那样简单。CleanMyMac X以极其快速和时尚的方式为您提供及时的建议,组…

WEB渗透—PHP反序列化(六)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

高级算法设计与分析(一) -- 算法引论

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 未完待续【 高级算法设计与分析(四) -- 贪…

客服聊天机器人的设计方法

本文会来讨论基于文本的客服聊天机器人的设计方法。 两种客服模式 人工客服 传统的人工客服,完全由人工来提供客服服务,就是客服坐在电脑旁边,同时开n个聊天窗口回复客户。这种方式需要投入很多的人力,效率比较低下。人工客服经…

零售EDI:如何与EDEKA 建立EDI连接?

艾德卡EDEKA 是德国最大的食品零售商,因其采用“指纹付款”的方式进行结算,成为德国超市付款方式改革的先驱。 与EDEKA建立EDI连接,首先需要填写EDEKA提供的调查问卷,其中包括公司信息、EDI负责人信息、EDI供应商信息、销售部门信…

Jmeter实现CSV数据批量导入

CSV:逗号分隔值,是一种简洁且常见的数据存储格式。 1、参数化: 在Jmeter中,可以通过“用户自定义的变量”来实现参数化使操作方便,使用语法位:${参数名},如下图: 而CSV也同理&…

android11-开机自启脚本

1. 编写myshell脚本 diff --git a/device/rockchip/rk356x/ok3568_r/myshell.sh b/device/rockchip/rk356x/ok3568_r/myshell.sh new file mode 100644 index 0000000000..c78b6d93bd --- /dev/nullb/device/rockchip/rk356x/ok3568_r/myshell.sh-0,0 1,4 #!/vendor/bin/shec…

ThinkPad E550c

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

C语言—每日选择题—Day56

指针相关博客 打响指针的第一枪:指针家族-CSDN博客 深入理解:指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 以下叙述中正确的是() A:\0 表示字符 0 B:"a" 表示一个字符常量 C:表…

C++内存布局(一)

温故而知新,本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分: 代码段:存储程序的机器代码。.数据段:存储全局变量和静态变量。数据段又分为初始化数据段(存储初始化的全局变量和…

JVM基础原理篇-透彻理解类加载子系统(学习笔记)

一、从Hello World轻松理解类加载的基本过程 1.类加载子系统整体工作过程 大白话: 符号引用 - 相当于建房子的图纸,在字节码文件中 直接引用 - 建房子,在Java的内存模型中 这里需要注意下面的代码 这里为什么先在静态代码块给a赋值20&#xf…

(四)pytorch图像识别实战之用resnet18实现花朵分类(代码+详细注解)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、关于这个实战的一些知识点Q1:图像识别实战常用模块解读Q2:数据增强Q3:迁移学习Q4:平均全局池化Q5:设置哪些层需要训练时…

MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany

本文主要介绍MongoDB的原子操作findAndReplace、findOneAndDelete和deleteMany。 目录 MongoDB的原子操作一、findAndReplace二、findOneAndDelete三、deleteMany MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改,并确保操作是…

JaCoCo 统计度量

1、JaCoCo: 一个判断算2个Branch,最后一个括号算一行 2、IDEA:一个判断算一个Branch,最后一个括号不算一行