Promise

devtools/2024/9/25 20:26:59/

Promise

Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题。

案例:模拟使用ajax连续发起两次请求

第一次请求monster.json获取到monster的id

{"id": 1,"name": "黑山老妖"
}

第二次请求需要根据第一次获取到的id来获取monster的详细信息

{"address": "阴曹地府-黑山","skill": "翻江倒海功","age": 800
}

传统的ajax方式:

javascript">//jquery 发出 ajax 的方式
$.ajax({url: "data/monster.json",success(resultData) {	//如果请求成功了,回调处理函数 successconsole.log("第 1 次 ajax 请求 monster 基本信息=", resultData);//发出第二次 ajax 请求$.ajax({url: `data/monster_detail_${resultData.id}.json`,success(resultData) {console.log("第 2 次 ajax 请求 monster 详细信息=", resultData);//$.ajax => callback hell}, error(err) { //出错的回调函数console.log("出现异常=", err);}})}, error(err) {console.log("出现异常=", err);}
})

使用promise:

javascript">	//1. 创建 Promise 对象//2. 构造函数传入一个箭头函数//3. (resolve, reject) 参数列表 resolve: 如果请求成功, 调用 resolve 函数//4. 如果请求失败, 调用 reject 函数//5. 箭头函数体, 仍然是通过 jquery 发出 ajaxlet p = new Promise((resolve, reject) => {//发出 ajax$.ajax({url: "data/monster.json", success(resultData) {	//成功后回调函数console.log("promise1 结果 =", resultData);resolve(resultData);}, error(err) {//console.log("promise1 请求异常=", err);reject(err);}})})//这里我们可以继续编写请求成功后的业务p.then((resultData) => {//这里我们可以继续发出请求//console.log("p.then 得到 resultData", resultData);return new Promise((resolve, reject) => {$.ajax({url: `data/monster_detail_${resultData.id}.json`, success(resultData) { //第 2 次 ajax 请求成功,回调函数console.log("promise2 结果 =", resultData);//继续进行下一次的请求resolve(resultData);}, error(err) { //第 2 次 ajax 请求失败,回调函数//console.log("promise2 请求异常=", err);reject(err);}})})}).then((resultData) => {//可以在这继续发起请求}).catch((err) => { //这里可以对多次 ajax 请求的异常进行处理console.log("promise 异步请求异常=", err);})

注意事项和使用细节:

  • 如果返回的是 Promise 对象,可以继续执行.then()
  • .then((data)=>{}) 的 data 数据是上一次正确执行后 resolve(data) 返回传入的
  • 通过多级.then() 可以对异步请求分层次请求,实现代码重排,代码逻辑更加清晰合理
  • 通过多级.then() 后面的 .catch((err) => {}) 可捕获发生异常,便于调试

http://www.ppmy.cn/devtools/5678.html

相关文章

20240417,友元 FRIEND

本来要学习的吃瓜吃了一下午 目录 3.1 全局函数做友元 3.2 友元类 3.3 成员函数做友元 三&#xff0c;友元 3.1 全局函数做友元 #include<iostream> using namespace std; class Building {friend void goodGay(Building* building);//好朋友&#xff0c;可以访问…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

SQLite 的命令行 Shell(三十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS5 扩展&#xff08;三十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 入门 SQLite 项目提供了一个名为 sqlite3&#xff08;或 Windows 上的sqlite3.exe&#xff09;的简单命令行程序 …

深度学习基础——卷积神经网络的感受野、参数量、计算量

深度学习基础——卷积神经网络的感受野、参数量、计算量 深度学习在图像处理领域取得了巨大的成功&#xff0c;其中卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标&#…

MongoDB快速启动

两种方法: 方式 1 &#xff1a;命令行参数方式启动服务 在 bin 目录中打开命令行提示符&#xff0c;输入如下命令&#xff1a; (mongod --dbpath..\data\db) mongod --dbpath..\data\db 方式 2 &#xff1a;配置文件方式启动服务 在解压目录中新建 config 文件夹&#xff0…

踏上R语言之旅:解锁数据世界的神秘密码(二)

R语言学习 文章目录 R语言学习1.数据的R语言表示2.多元数据的R语言调用3.多元数据的简单R语言分析 总结 1.数据的R语言表示 数据框&#xff08;data frame) R语言中用函数data.frame()生成数据框&#xff0c;其句法是&#xff1a; data.frame(data1,data2,…)&#xff0c;例如…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

选择生产制造项目管理系统?全面解析功能与实际应用!

生产效率和项目规划是制造企业亟需解决的难题&#xff0c;想要从容的应对这些挑战&#xff0c;离不开好用的生产制造项目管理系统。下面我们全面解析什么才能称得上是好用的生产制造项目管理系统。 一、好用的生产制造项目管理系统 什么样的项目管理系统才能算是好用呢&#x…