异步编程Promise

news2024/9/24 7:17:24

文章目录

  • 前言
  • 一、关于 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

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

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

相关文章

阿赵UE学习笔记——2、新建项目和项目设置

阿赵UE学习笔记目录 大家好,我是阿赵。继续来学习虚幻引擎的使用。这次介绍一下新建项目和项目设置。 一、新建项目 通过桌面快捷方式,或者EPIC Games Loader,启动虚幻引擎。 启动完成后,会打开项目管理的界面,可以看…

HarmonyOS ArkTS 中DatePicker先择时间 路由跳转并传值到其它页

效果 代码 代码里有TextTimerController 这一种例用方法较怪,Text ,Button Datepicker 的使用。 import router from ohos.router’则是引入路由模块。 import router from ohos.router Entry Component struct TextnewClock {textTimerController: TextTimerContr…

【开源项目】基于STM32的服装仓库环境监测系统设计与实现

该系统结合了多种物联网的技术如WiFi技术、嵌入式技术等,通过温湿度传感器和火焰传感器实时采集仓库的温度、空气湿度和仓库明火情况。系统能够自动判断并处理异常情况,当温湿度超过阈值时风扇模块开始工作进行通风,当有明火时抽水泵模块开始…

计算机msvcp120.dll文件丢失怎么办?亲测有效的五个方法分享

最近,我在使用电脑的过程中遇到了一个非常棘手的问题,那就是msvcp120.dll文件丢失。这个错误通常会导致某些应用程序无法正常运行。经过一番努力和尝试,我终于找到了解决这个问题的方法,,小编将介绍五个常用的解决方法…

自定义 spring-boot组件自动注入starter

1&#xff1a;创建maven项目 2&#xff1a;pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati…

ITIL® 4 Foundation​,12月23日即将开课~想了解点击查看

ITIL 4 Foundation即将开课~ 想报名的必须提前预约啦 &#x1f447;&#x1f447;&#x1f447; 培训地点&#xff1a; 远程直播&#xff1a;线上平台学习 开课时间&#xff1a; 周末班&#xff1a;12月23日、24日&#xff1b; 什么是ITIL&#xff1f; 信息技术基础架构…

28 在Vue3中监听对象属性

概述 更多的时候&#xff0c;我们可能想要监听的是对象中的某个属性。 比如&#xff0c;我们提交用户的登录表单&#xff0c;有username&#xff0c;password和re_password的三个属性&#xff0c;我们监听re_password这个属性&#xff0c;一旦发生改变&#xff0c;我们就要判…

网络基础介绍

1.网线制作 1.1 网线制作需要的工具 网线 网线钳 水晶头 测试仪 ​编辑 1.2 网线的标准 1.3 网线的做法 2.集线器&交换机&路由器的介绍 3.OSI七层模型 4.路由器的设置 4.1 常见的路由器设置地址 4.2 常见的路由器账号密码 4.3 登录路由器 设置访客网…

神经网络:池化层知识点

1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择&#xff0c;提取区域内最具代表性的特征&#xff0c;能够有效地减少输出特征数量&#xff0c;进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…

【MongoDB】--MongoDB的Sort排序问题

目录 一、问题背景描述1.1、问题背景1.2、问题分析 二、建立索引支持深度翻页查询2.1、调整sort排序的内存限制【不建议】2.2、创建索引2.3、拓展--组合索引什么时候失效 二、聚合查询解决深度翻页查询 一、问题背景描述 1.1、问题背景 现实系统页面翻页到20000页之后&#x…

Eclipse导入SSM项目

Eclipse导入SSM项目 导入项目 配置JDK环境 去除校验 设置Tomcat 效果如下&#xff1a; 配置Tomcat端口 启动Tomcat

【数据结构和算法】盛最多水的容器

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;暴力枚举 2.2 方法二&#xff1a;双指针 三、代码 3.1 方法一&#xff1a;暴力…

关于B+树的总结

B树(B-tree) B树属于多叉树又名平衡多路查找树&#xff08;查找路径不只两个&#xff09;&#xff0c;数据库索引技术里大量使用着B树和B树的数据结构 规则&#xff1a; &#xff08;1&#xff09;排序方式&#xff1a;所有节点关键字是按递增次序排列&#xff0c;并遵循左小…

浅析RoPE旋转位置编码的远程衰减特性

为什么 θ i \theta_i θi​的取值会造成远程衰减性 旋转位置编码的出发点为&#xff1a;通过绝对位置编码的方式实现相对位置编码。 对词向量 q \boldsymbol{q} q添加绝对位置信息 m m m&#xff0c;希望找到一种函数 f f f&#xff0c;使得&#xff1a; < f ( q , m ) …

技术资讯:Firefox浏览器即将被淘汰?

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要2分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff01…

OpenHarmony开发—Ubuntu环境搭建

搭建Ubuntu环境 在嵌入式开发中&#xff0c;很多开发者习惯于使用Windows进行代码的编辑&#xff0c;比如使用Windows的Visual Studio Code进行OpenHarmony代码的开发。但当前阶段&#xff0c;大部分的开发板源码还不支持在Windows环境下进行编译&#xff0c;如Hi3861、Hi3516…

高高。。。。

重点&#xff1a;存储系统/分布式系统 得到数据&#xff1a; 数据模型计算&#xff08;简单系统&#xff09;实现一个操作系统CPU&#xff08;成本高&#xff09;仿真实验 文章类型&#xff1a; 国际会议 10-15slices期刊论文 做OS研究为其他方面提供支持 一 Advanced OS …

【VScode和Leecode的爱恨情仇】command ‘leetcode.signin‘ not found

文章目录 一、关于command ‘leetcode.signin‘ not found的问题二、解决方案第一&#xff0c;没有下载Nodejs&#xff1b;第二&#xff0c;有没有在VScode中配置Nodejs第三&#xff0c;力扣的默认在VScode请求地址中请求头错误首先搞定配置其次搞定登入登入方法一&#xff1a;…

C++命名空间(超详细)using namespace std

文章目录 前言一、为什么要有命名空间二、命名空间的定义1.正常定义2.嵌套定义3.多文件 三、命名空间的使用1.命名空间名称作用域限定符2.使用using将命名空间某个成员引入3.使用using namespace将整个命名空间引入 四、c标准库总结 前言 在本文章中&#xff0c;我们将要详细介…

【CANoe】CAPL中测试控制函数和故障注入函数的使用

文章目录 1、介绍2、示例脚本【可结合总线报文的变化进行理解】 1、介绍 2、示例脚本【可结合总线报文的变化进行理解】 testcase TC01() {TestCaseTitle("TC01","TC01");//示例1&#xff1a;禁止/使能发送BMS_100ms这帧报文testDisableMsg(BMS_100ms);te…