Promise简单概述

一. Promise是什么?

理解

1.抽象表达:
Promise是一门新的技术(ES6规范)
Promise是JS中进行异步编程的新解决方案(旧方案是单纯使用回调函数)
异步编程:包括fs文件操作,数据库操作(Mysql),AJAX,定时器
2.具体表达
1.从语法上来说:Promise对象用来封装一个异步操作并可以获取其成功/失败的结果值

二.为什么要用Promise?

1.支持链式调用,解决回调地狱问题

1.什么是回调地狱

回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件

2.回调地狱的缺点?

不便于阅读
不便于异常处理

3.解决方案

promise链式调用

2.指定回调函数的方式更加灵活

1.旧的:必须在启动异步任务前指定
2.promise:启动异步任务=>返回promise对象=>给promise对象绑定回调函数(可以绑定多个)

三. Promise工作模式

在这先new Promise,刺客里插入图片描述

Promise的状态(PromiseState)改变

1.pending 未决定的
1.pending 变为resolved/fullfilled 成功
2.pending 变为rejected 失败

说明:只有这两种pending的变化,且一个Promise对象只能改变一次
无论成功还是失败,都会有一个结果数据
成功的结果数据一般为value,失败的结果数据一般为reason

Promise对象的值

实例对象中的另一个属性(PromiseResult)
保存着异步任务成功/失败的结果,只能通过resolve与reject函数传递给then方法解决

四. 如何使用Promise

API

1.promise构造函数:promise(executor){}

(1)executor函数:执行器(resolve,reject)=>{}
(2)resolve函数:内部定义成功时我们调用的函数 value=>{}
(3)reject函数:内部定义失败时我们调用的函数 reason=>{}
说明:executor会在Promise内部立即同步调用,异步操作在执行器中执行

2.Promise.prototype.then方法:(onResolved,onRejected)=>{}

(1)onResolved函数:成功的回调函数 (value)=>{}
(2)onRejected函数:失败的回调函数(reason)=>{}
说明:指定用于得到成功的value的成功回调和用于得到失败reason的失败回调,返回一个新的promise对象

3.Promise.prototype.catch方法:(onRejected)=>{}

(1)onRejected函数:失败的回调函数(reason)=>{}

4.Promise.resolve方法:(value)=>{}

(1)value:成功的数据或promise对象
说明:返回一个成功/失败的promise对象

5.Promise.reject方法:(reason)=>{}

(1)reason:失败的原因
说明:返回一个失败的promise对象

6.Promise.all方法:(promises)=>{}

(1)promises:包含n个promises的数组
说明:返回一个新的promise,只有所有的promise成功才算成功,只要有一个失败了就直接失败

7.Promise.race方法(promises)=>{}

(1)promises:包含n个promises的数组
说明:返回一个新的promise,第一个完成的promise的结果状态就是最终的结果状态

三.promise的几个关键问题

1.如何改变promise的状态

 1.    resolve(value):如果当前是pending就会变为resolved 2.    reject(reason):如果当前是pending就会变为rejected 3.    抛出异常:如果当前是pending就会变为rejected

2.一个promise指定多个成功/失败的回调函数,都会被调用吗?

当promise改变为对应状态时都会调用

3.改变promise状态和指定回调函数谁先谁后

(1)都有可能,正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调
(2)如何先改状态再指定回调?

   1.在执行器中直接调用resolve(),reject(),执行同步任务2.延迟更长事件才调用then()回调

(3)如何先回调再改状态?

执行器中有异步任务的时候,例如有定时器

(4)什么时候才能得到数据?

 1.如果先指定的回调,那当状态发生改变时,回调函数就会调用,得到数据2.如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据

4.promise.then()返回的新的promise的结果状态由什么决定

   (1)简单表达:由then()指定的回调函数执行的结果决定(2)详细表达1. 如果抛出异常,新promise变为rejected,reason为抛出的异常2. 如果返回的是非promise的任意值,新promise变为resolved,value为返回的值3. 如果返回的是另一个新promise,此promise的结果就会成为新promise的结果

5.promise如何串联多个操作任务

1.promise的then()返回一个新的promise,可以开成then()的链式调用
2.通过then的链式调用串联多个同步/异步任务

6.promise异常传透?

1.当使用promise的then链式调用时,可以在最后指定失败的回调
2.前面任何操作出了异常,都会传到最后失败的回调中处理

7.如何中断promise链

1.当使用promise的then链式调用时,在中间中断,不再调用后面的回调函数
2.办法:

 在回调函数中返回一个pendding状态的promise对象,pendding状态不发生改变就不会向下执行

四.async与await

1.async 函数

1.**函数的返回值为promise对象**
2**.promise对象的结果由async函数执行的返回值决定**

2.await表达式

1.**await右侧的表达式一般为promise对象**,但也可以是其他的值
2.如果表达式是promise对象,await返回的是promise成功的值
3.如果表达式是其他的值,则直接将此值作为await的返回值

3.注意

 **1.await必须写在async函数中,但async函数中可以没有await2.如果await的promise失败了,就会抛出异常,需要通过try...catch进行捕获异常处理**

五.总结

Promise是一种用于处理异步操作的编程模式,它可以更好地管理和组织异步代码。

1.Promise是一个代表了异步操作最终完成或失败的对象。它可以有三种状态:pending(进行中)、fulfilled(已完成)和rejected(已失败)。

2.Promise通过链式调用的方式来处理异步操作,使得代码更加清晰和易于维护。可以通过then()方法来注册成功回调函数,通过catch()方法来注册失败回调函数。

3.Promise提供了一种解决回调地狱(callback hell)问题的方式,使得异步代码更加可读和可控。通过链式调用,可以按照顺序执行多个异步操作,并在每个操作完成后进行相应的处理。

4.Promise还提供了一些其他的方法,如all()、race()和resolve()等,用于处理多个Promise实例的情况,或者快速创建一个已经完成或失败的Promise实例。

5.Promise还支持错误处理机制,可以通过catch()方法捕获并处理异常,避免程序崩溃或出现未处理的异常。

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

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

相关文章

使用Nodejs + express连接数据库mongoose

文章目录 先创建一个js文档安装 MongoDB 驱动程序:引入 MongoDB 模块:设置数据库连接:新建一个表试试执行数据库操作:关闭数据库连接: 前面需要准备的内容可看前面的文章: Express框架搭建项目 node.js 简单…

Java高频面试之JVM篇

说一下 Jvm 的主要组成部分?及其作用? 类加载器执行器运行时数据区域本地接口 谈谈对运行时数据区的理解? 堆和栈的区别是什么? 堆中存什么?栈中存什么? 堆总存对象,栈中存局部变量,引用 为什么要把堆…

什么牌子的运动耳机比较好?五款舒适又实用的运动耳机推荐

跑步、健身、游泳……无论你的运动喜好是什么,一款好的运动蓝牙耳机都能为你的运动体验加分。然而,市面上的运动蓝牙耳机品牌众多,如何选择一款既舒适又实用的产品呢?本文将为你提供一些选购运动蓝牙耳机建议,并为你推…

数字时代的新风向标:海外网红营销与年轻一代的话题热潮

随着互联网的不断普及和社交媒体的迅猛发展,海外网红营销已成为引领年轻一代话题热潮的重要力量。这一趋势不仅改变了传统营销模式,更深刻地影响了年轻人的消费观念、审美趣味以及生活方式。本文Nox聚星将和大家探讨海外网红营销如何成功地吸引了年轻人的…

智能合约平台开发指南

随着区块链技术的普及,智能合约平台已经成为了这个领域的一个重要趋势。智能合约可以自动化执行合同条款,大大减少了执行和监督合同条款所需的成本和时间。那么,如何开发一个智能合约平台呢?以下是一些关键步骤。 一、选择合适的区…

mysql重启失败

服务器重启了一下,然后启动后发现mysql自动启动没有生效,于是手动通过systemctl启动mysqld,然后就报错:Starting MySQL...........The server quit without updating P[FAILED](/data/mysql/iz2zebvmy1qv3fao9c5riuz.pid). 根据配置my.cnf文…

为什么选择成为程序员?

目录 兴趣和热爱高薪和就业机会持续学习和不断成长挑战和乐趣 兴趣和热爱 许多人选择成为程序员可能是热爱,对计算机,以及编程和科技产生了浓厚的兴趣,并且享受着解决每一个技术问题,构建应用程序和探索新技术所带来的乐趣。 谈到…

二进制ip地址如何进行掩码网络地址和cidr划分?

看到网上有人问下面的问题: 解答过程: 首先这是一个默认的abc类地址进行cidr变长掩码划分的问题。 首先我们知道,ip地址是32位二进制,为了记忆方便每8位分成四段,用0-255和符号.来表示如192.168.1.100 ip地址具有寻址…

海外媒体发稿:新加坡 Asia One VS新加坡sg雅虎

海外媒体发稿:新加坡 Asia One VS新加坡sg雅虎 新加坡:雅虎 官网:sy.yahoo.com 官网:asiaone.com/lite 亚洲第一站。是 新加坡的新闻和生活方式网站和新闻聚合器。它是 新加坡第一个纯数字 内容平台,主要为新加坡、…

功能测试_验证新浪邮箱登录的正确性

案例:验证验证新浪邮箱登录的正确性 功能测试_等价类设计用例: 步骤: 1:明确需求:邮箱能否登录 2:划分等价类:有效等价类、有效取值、无效等价类、无效取值 3:提取数据编写用例:用例编号、…

【原创】springboot+mysql校园跑腿管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

记一次生产环境Java堆内存溢出问题排查思路

1. 用Visual VM 加载堆转储文件 先将转储文件从服务器下载下来,打开Visual VM,点击右上角的Load Snapshot,将这个转储文件加载到Visual VM中。 2. 用Visual VM 分析堆转储文件 1)首先看到是醒目的红色,这里标记了堆…

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说,是目前最强大、最难防御的攻击之一,属于世界级难题,并且没有解决办法。 Doss攻击的原理不复杂,就是利用大量肉鸡仿照真实用户行为,使目标服务器资源…

Rust语言

文章目录 Rust语言一,Rust语言是什么二,Rust语言能做什么?Rust语言的设计使其适用于许多不同的领域,包括但不限于以下几个方面:1. 传统命令行程序:2. Web 应用:3. 网络服务器:4. 嵌入…

albef论文学习

首先要知道vit是啥东西。vit就是transformer模型在图像领域的运用。 transformer模型原本是用于自然语言的,encoder和decoder接受的都是文字。vit把图像分割成很多个小块,把各个小块拉长当成向量来用,接下来就是一样的。最后接一个全连接层做…

PostgreSQL入门到实战-第二十弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(四)官网地址PostgreSQL概述PostgreSQL中LEFT JOIN命令理论PostgreSQL中LEFT JOIN命令实战更新计划 PostgreSQL中表连接操作(四) 如何使用PostgreSQL LEFT JOIN子句从多个表中选择数据 官网地址 声明: 由于操作系统, 版本更新等…

14亿美元!德国默克与AI生物科技公司合作;马斯克Neuralink首位脑机接口植入者用意念打游戏;黄仁勋在俄勒冈州立大学开讲

AI for Science 的新成果、新动态、新视角—— 日本第一 IT 公司富士通:生成式 AI 加速药物研发 马斯克:Neuralink 首位脑机接口植入者用「意念」打游戏 默克与 AI 生物科技公司 Caris 达成合作 AI 蛋白质设计服务提供商「天鹜科技」完成数千万元 Pre…

CPU核心数、线程数都是什么意思?

最早,每个物理 cpu 上只有一个核心,对操作系统而言,也就是同一时刻只能运行一个进程/线程。 为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出现了多核 cpu&…

bugku-web-你从哪里来

这里就这一句话提示,问我是不是谷歌的? 用谷歌浏览器访问 没看见什么变化 抓包查看 没有变化 这时我想到爬虫中的反爬策略中有一种,判断请求的当前界面来判断用户的起始判断位置 这时抓取报文 GET / HTTP/1.1 Host: 114.67.175.224:1516…

【简单讲解macOs虚拟机安装全过程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…