目录

一、Promise是什么

二、回调地狱

三、Promise解决回调地狱的原理

四、promaise实例


一、Promise是什么

1、主要用于异步计算

2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果

4、可以在对象之间传递和操作promise,帮助我们处理队列

二、回调地狱

当一个回调函数嵌套一个回调函数的时候,就会出现一个嵌套结构,当嵌套的多了就会出现回调地狱的情况, 比如我们发送三个 ajax 请求,第一个正常发送,第二个请求需要第一个请求的结果中的某一个值作为参数,第三个请求需要第二个请求的结果中的某一个值作为参数,回调地狱,其实就是回调函数嵌套过多导致的。

ajax({url: '我是第一个请求',success (res) {// 现在发送第二个请求ajax({url: '我是第二个请求',data: { a: res.a, b: res.b },success (res2) {// 进行第三个请求ajax({url: '我是第三个请求',data: { a: res2.a, b: res2.b },success (res3) {console.log(res3) ;// ...}})}})}})

三、Promise解决回调地狱的原理

下面就带大家创建一个Promise对象

let p1 = new Promise(function (resolve, reject) {// 此处执行异步的代码setTimeout(()=>{// 我们可以根据自己的标准在异步任务完成的时候// 选择是执行失败的回调函数还是成功的回调函数// 第一个形参resolve 表示成功的回调resolve('300')// 第二个形参reject 表示失败的回调},3000)
})// 定义当p1这个promise对象变成成功状态的时候要执行的回调函数
p1.then((data)=>{console.log("我是成功的时候执行的函数")console.log("我执行的时候你给我传入的参数",data)
})// 定义当p1这个promise对象变成失败状态的时候要执行的回调函数
p1.catch((err)=>{console.log("我是失败的时候执行的函数")console.log("我执行的时候你给我传入的参数",err)
})

resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise是一个对象,这个对象有三个状态:

待定(pending):初始状态,既没有成功,也没有失败,表示异步任务正在进行中

成功(fulfilled):异步任务执行完毕,变成成功状态

失败(rejected):异步任务执行完毕,变成失败状态

当promise状态发生改变,就会触发then()里的响应函数处理后续步骤;

promise状态一经改变,不会再变

Promise对象的状态改变,只有两种可能:

从pending变为fulfilled

从pending变为rejected

Promise对象这样就创建好了,下面来解决ajax回调地狱问题。

四、promaise实例

传统写法

const fs = require("fs")
fs.readFile("./one.txt", (err, data1) => {fs.readFile("./two.txt", (err, data2) => {fs.readFile("./three.txt", (err, data3) => {console.log(data1 + "\n" + data2 + "\n" + data3)})})
})

Promise写法

const fs = require("fs")const p = new Promise((resolve, reject) => {fs.readFile("./one.txt", (err, data) => {resolve(data)})
})
p.then(value => {return new Promise((resolve, reject) => {fs.readFile("./two.txt", (err, data) => {resolve([value, data])})})
}).then(value => {return new Promise((resolve, reject) => {fs.readFile("./three.txt", (err, data) => {value.push(data)resolve(value)})})
}).then(value => {let str = value.join("\n")console.log(str)
})

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes知识点】Pod调度和ConfigMaps

目录 1.如何将特定Pod调度到指定的节点? 2.什么是节点的亲和性? 3.什么是污点,它的主要用途是什么? 4.解释ConfigMap的作用。 5.Secret和ConfigMap相比较有哪些优点。 6.解释ResourceQuota的作用 1.如何将特定Pod调度到指定…

火车头使用Post方法采集Ajax页面教程

前面有写过一篇瀑布流的采集方法,今天在添加一个POST方法来采集Ajax刷新页面的教程。 之前的文章请看:火车头采集动态加载Ajax数据(无分页瀑布流网站) 如果遇到POST方法来架子Ajax数据,这和我之前写的是两个类型&…

【学习记录】structuredClone,URLSearchParams,groupBy

structuredClone() 可以进行深拷贝,这里有详细讲解:Window:structuredClone() 方法 当需要处理包含嵌套对象或数组的复杂数据结构时,建议使用 structuredClone() 来保护原始数据。 举例:别再用 … 扩展运算符了&#x…

30条AI编程指令

大家好,小机又来分享AI了。 前言: 凌晨三点,你还在像素级对齐那个永远对不齐的按钮;刚写完的API文档,产品经理一句"需求变了" 让你瞬间崩溃;更扎心的是,实习生用AI十分钟搞定了你要…

AI+虚拟仿真:以科技之光照亮希望的田野

在乡村振兴与农业现代化的全新征程中,农林专业人才肩负着科技赋能土地、守护绿色发展的重任。然而,现有的教育模式却越发不适应农业人才的培养需求。“AI虚拟仿真”正在为农业现代化人才建设提供创新的技术引擎。市场风口与政策红据统计,2024…

04_函数

第4课:函数 课程目标 掌握函数的定义和调用方法学习参数传递和返回值的使用理解函数的作用域和命名空间 1. 函数的基本概念 函数是一段可重复使用的代码块,用于执行特定的任务。 2. 函数的定义和调用 # 定义函数 def greet():print("你好&#xff0…

STM32学习笔记19-FLASH

FLASH简介STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,读取指定寄存器直接使用指针读即可读写FLASH的用途:利用程序存储器的…

电蚊拍的原理及电压电容参数深度解析:从高频振荡到倍压整流的完整技术剖析

1. 引言在炎炎夏日,蚊虫成为人们生活中的一大困扰。电蚊拍作为一种高效、环保的物理灭蚊工具,凭借其便携性和实用性在全球范围内得到了广泛应用。然而,许多用户对这种看似简单的小家电背后的工作原理知之甚少。电蚊拍是一种新型的灭蚊小家电&…

Mac简单测试硬盘读写速度

一、下载软件 Blackmagic Disk Speed Test 「达芬奇 磁盘速度测试」二、选中测试位置可以随便选个文件比如“下载”目录三、开始测速

⸢ 零 ⸥ ⤳ 安全体系构建内容结构

👍点「赞」📌收「藏」👀关「注」💬评「论」在金融科技深度融合的背景下,信息安全已从单纯的技术攻防扩展至架构、合规、流程与创新的系统工程。作为一名从业十多年的老兵,系统阐述数字银行安全体系的建设路…

XP系统安装Android Studio 3.5.3并建立Java或Native C++工程,然后在安卓手机上运行

第一节 安装Android Studio 3.5.3Android Studio 3.5.3下载地址:Android Studio 3.5.3 December 5, 2019 Windows (32-bit): android-studio-ide-191.6010548-windows32.zip (756.1 MB) https://redirector.gvt1.com/edgedl/android/studio/ide-zips/3.5.3.0/androi…

calchash.exe和chckhash.exe计算pe文件hash值的两个实用小工具

第一部分: C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\NT5.CAT t部分内容B B D 0 2 2 2 1 A A 6 5 5 6 2 8 F 4 9 5 F 6 C D 3 0 3 9 0 8 B B E 0 0 F 9 5 9 5 第二部分: D:\>calchash.exe pidgen.dll BB D0 22 21 AA 65 …

lanczso算法中的额外正交化代码解释

额外正交化 定义:在Lanczos算法中,由于浮点误差,生成的向量可能不完全正交,需要额外正交化步骤。代码实现:def extra_orthogonalization(v, basis):for u in basis:v - u * (v.dot(u) / u.dot(u))

Rabbit 实战指南-学习笔记

第 4 章 RabbitMQ 进阶 mandatory 参数 Returning | RabbitMQ 当 mandatory 参数设为 true 时,交换器无法根据自身的类型和路由键找到一个符合条件的队列,那么RabbitMQ 会调用 Basic.Return 命令将消息返回给生产者,通过调用channel.addReturnListener …

BEVDet4D

1. BEVDet4D算法动机及开创性思路 1)BEVDet算法概述输入输出:输入为6视角图像(NuScenes数据集),输出为3D检测结果核心模块: 图像编码器:由Backbone网络和多尺度特征融合网络组成,处理…

当 AI 学会 “理解” 人类:自然语言处理的进化与伦理边界

大家可以去我的资源看看,有很多关于AI的免费资源可以下载,不下载也可以看看,真的对你有用引言:从 “对话” 到 “理解”——AI 语言能力的时代跃迁现实锚点:以日常场景切入(如 ChatGPT 流畅回应复杂问题、A…

WPF控件随窗体大宽度高度改变而改变

前台控件中:Width"{Binding RelativeSource{RelativeSource AncestorTypeWindow}, PathWidth}"后台代码:定义在加载事件里面this.SizeChanged ProductData_SizeChanged;private void ProductData_SizeChanged(object sender, SizeChangedEven…

E10 通过RPC实现账号批量锁定与解锁

需求背景:账号信息由三方系统管理,包含账号状态,所以需要通过提供给三方的 Rest 接口中,实现账号锁定与解锁。参考基线版本:10.0.2506.01,过低的版本可能无法使用。 锁定分为两种: (…

什么是AI宠物

什么是AI宠物AI宠物是由AI大脑驱动的生命体AI产品。它能主动产生情绪和意图,并通过情绪和意图去驱动自己的动作和行为。它根据自己的意愿和用户互动,不受用户控制。从一定意义上讲,它拥有了人工生命和自由意志。它有自己的行为逻辑&#xff0…

简单AI:搜狐公司旗下AI绘画产品

本文转载自:简单AI:搜狐公司旗下AI绘画产品 - Hello123工具导航 ** 一、平台定位与技术特性 搜狐简单 AI 是搜狐推出的多模态 AI 创作平台,基于自研大模型提供文生图、文生文等能力。它专注于零门槛内容生成,用户无需专业技能即…