九、前端中的异步方法Promise,Promise详解

news2024/9/20 8:43:33

文章目录

    • 1.Promise简介
      • 什么是promise
      • 为什么使用Promise
      • promise中的状态
    • 2.Promis的用法

1.Promise简介

什么是promise

Promise是异步编程的一种解决方案,它的构造函数是同步执行的,then 方法是异步执行的。

为什么使用Promise

在JavaScript的世界中,所有代码都是单线程执行的。但是,很多网络操作,浏览器事件,都必须是异步执行,以保证软件的执行效率,毕竟如果用户发一个请求,网站在请求期间直接卡住,用户什么操作都做不了,是一个很糟糕的体验。异步f方法执行后的同步处理可以用回调函数实现,回调函数形式如下:

function callback() {
    console.log('Done');
}
doSometing(){
	.....
	callBack()
}

但是这样存在一个问题,比如我们先要向服务器请求数据A,得到A后,再通过A向服务器请求B,得到B后还需要得到C,最后才能真正用C来处理我们的数据,这时候就会有三层回调!

getA(function(A) {
  getB(A, function(B) {
    getC(B, function(C) {
      console.log('得到最终结果: ' + C);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

阅读上面代码,是不是很难受,上述形成了经典的 回调地狱。Promise就是用来处理这样的问题的。现在用promise来重写写这样的逻辑:

getA().then(function(A) {
  return getB(A);
})
.then(function(B) {
  return getC(B);
})
.then(function(C) {
  console.log('得到最终结果: ' + C);
})
.catch(failureCallback);

这样是不是变得清晰很多啦!
我们可以发现,promise的链式操作减低了编码难度,代码可读性明显增强。

promise中的状态

promise对象仅有三种状态
pending(进行中)
fulfilled(已成功)
rejected(已失败)

pedding(初始状态):调用promise时,一开始就呈现出等待状态,遇到resolve或者reject之前,都处于这个状态,且可以改变,但如果确定了状态(fulfilled/reject),则结果将永远不变,不能再次修改

fulfilled(成功状态):在执行了resolve后,promise则会从pedding变成fulfilled,后续会进入.then 的回调函数中,在回调函数的第一个参数函数中可以获取到值

rejected(失败状态):在执行了reject后,promise状态会变成rejected,rejected函数传递的参数,可以在.then的第二个参数函数中获取的到,或者是在.catch获取到,但是如果程序上的错误,得通过.catch函数去拿到失败消息,在.then中是获取不了的

认真阅读下图,我们能够轻松了解promise整个流程
在这里插入图片描述

2.Promis的用法

Promise对象是一个构造函数,用来生成Promise实例:

const p1 = new Promise((resolve, reject) => {
  resolve('hello');
})
.then(result => result)
.catch(e => e);

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。

resolve:用于创建一个成功状态的Promise对象,可以之间在.then的成功回调中,获取resolve的值。

const p = Promise.resolve("成功");
p.then((res) => {
  console.log("----打印:", res); //----打印: 成功
});
 
//该用法类似于
const p1 = new Promise((resolve, reject) => {
  resolve("成功");
});
p1.then((res) => {
  console.log("----打印:p1", res); //----打印:p1 成功
});
 
//后续代码中都会出现类似,或者另外中写法,尝试的时候,不能同时放出来执行

reject:这个方法跟Promise.resolve一样,只是作用不同,属于拒绝的状态;可以直接在.then的失败回调中,获取reject的值;也可以在.catch中获取;如果两者同时出现代码中,看看是catch写在前面还是.then函数写在前面 —业务中,拒绝状态用.then去执行回调,异常用.catch

const p = Promise.reject("失败");
p.then(
  (res) => {
    console.log("----打印:", res); //不执行
  },
  (rej) => {
    console.log("----打印:", rej); //----打印: 失败
  }
);
 
//另外写法 
p.then(
  (res) => {
    console.log("----打印:p", res); //不执行
  },
  (rej) => {
    console.log("----打印:p", rej); //----打印:p 失败
  }
).catch((error) => {
  console.log("----打印:catch", error); //不执行
});
 
//另外写法---基本没有吧catch写在第一个
p.catch((error) => {
  console.log("----打印:catch", error); //----打印:catch 失败
}).then(
  (res) => {
    console.log("----打印:p", res); //不执行
  },
  (rej) => {
    console.log("----打印:p", rej); //不执行
  }
);
 
//另外写法
p.then((res) => {
  console.log("----打印:p", res); //不执行
}).catch((error) => {
  console.log("----打印:catch", error); //----打印:catch 失败
});
 
//该用法类似于
const p1 = new Promise((resolve, reject) => {
  reject("失败");
});
p1.then(
  (res) => {
    console.log("----打印:p1", res); //不执行
  },
  (rej) => {
    console.log("----打印:p1", rej); //----打印:p1 失败
  }
);

另外,Promise构建出来的实例存在以下方法:

  • then()
  • catch()
  • finally()

then():
then是实例状态发生改变时的回调函数,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

catch:
catch()方法是 .then(null, rejection) 或 .then(undefined, rejection) 的别名,用于指定发生错误时的回调函数.

getJSON('/posts.json').then(function(posts) {
  // ...
}).catch(function(error) {
  // 处理 getJSON 和 前一个回调函数运行时发生的错误
  console.log('发生错误!', error);
});

finally()
finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

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

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

相关文章

入门Java编程的知识点—>数组(day05)

重点掌握数组是什么?为什么要使用?如何进行数组的定义? 数组 数组是用来存储同一类型多个元素的存储结构,数组是引用数据类型. 存储同一类型的多个元素如何理解? 生活中: 衣柜→可以存储多个衣服 | 鞋柜→可以存储多个鞋子 | 橱柜→可以存储…

嵌入式Qt移植之tslib部署到Busybox根文件-思维导图-学习笔记-基于正点原子阿尔法开发板

嵌入式Qt移植之tslib部署到Busybox根文件 烧写Busybox根文件系统到开发板 准备好一个固化系统 以TF卡为例子 TF 卡用读卡器插到 Ubuntu 虚拟机 会出现两个分区 boot分区是存放内核和设备树这些 rootfs分区是存放文件系统的 eMMC、NADA FLASH或者其他方式挂载也可&#xf…

windows删除不了的一些长名字文件,为什么python可以删除?

感谢阅读 windows报错截图windows最大文件路径长度限制为什么基于windows系统运行的python可以完成删除文件名259字符的文件?文件系统的存储方式操作系统和文件系统的关系总结 windows报错截图 windows最大文件路径长度限制 但真的是260字符吗?早期windo…

系统分析师4:数据库系统

文章目录 1 数据库体系结构1.1 三级模式和两级映像1.2 分布式数据库1.2.1 分布式数据库概述1.2.2 分布式数据库特点1.2.3 透明性分类 2 数据库设计2.1 数据库设计概述2.2 概念结构设计2.3 逻辑结构设计 3 关系代数3.1 关系代数介绍3.2 典型例题 4 规范化理论4.1 规范化理论基础…

《黑神话·悟空》背后的神秘力量——揭秘游戏服务器架构

✌ 作者名字:高峰君主 💂 作者个人网站:高峰君主 - 一个数码科技爱好者 📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀 💬 人生格言:没有…

“智汇论坛“——基于 Spring 前后端分离版本的论坛系统

一.项目背景 1.项目简介 智汇论坛是一个集高科技与高效交流于一体的在线社区平台,旨在为用户提供一个便捷、智能的讨论空间。通过集成先进的服务器端技术和丰富的浏览器端技术,智汇论坛不仅支持用户之间的实时互动与信息共享,还确保了平台的…

火语言RPA流程组件介绍--提取应用内嵌资源

🚩【组件功能】:提取应用内嵌的文件、图片及文本等资源 配置预览 配置说明 提取类型 文件|图片|文本 选择资源 选择内嵌资源中的文件或者文本图片 提取成 路径|文本|二进制内容 输入输出 输入类型 万能对象类型(System.Object)输出类型 字符串…

电脑U口管理软件分享|U口管理软件哪个好?

电脑U口(即USB端口)管理软件是保护电脑安全、防止数据泄露和恶意软件入侵的重要工具。 在选择U口管理软件时,需要考虑其功能、易用性、安全性以及是否满足个人或企业的具体需求。以下是一些值得推荐的电脑U口管理软件及其特点: 1…

Ptrade获取热门板块,连板股票 python代码

之前有人咨询,ptrade如何获取不同的概念板块个股。其实很容易,本身有获取板块信息的API函数: get_sort_msg – 获取板块、行业的涨幅排名 get_sort_msg(sort_type_grpNone, sort_field_nameNone, sort_type1, data_count100) 接口说明 该接…

cola_os学习笔记(上)

cola_os的学习笔记 声明 该项目系本人学习项目所做的笔记。该项目的项目地址为cola_os: 300行代码实现多任务管理的OS,在很多MCU开发中,功能很简单,实时性要求不强,如果使用RTOS显得太浪费,任务多了管理不当又很乱&a…

《行进中国大运河篇》圆满收官 郭品超讲述运河精神展文化自信

昨日,山东卫视大型文化探访综艺节目《行进中国大运河篇》圆满收官。节目中,演员郭品超携手行进团成员张晓谦和俞庚寅,一同从杭州出发,沿着京杭大运河一路向北,途径江苏、山东,河南、河北、天津等多个省市&a…

什么是主机监控审计系统?三款热门计算机监控审计系统推荐!

主机监控审计系统是保障企业IT基础设施安全的重要工具,通过实时监控、记录和分析主机上的活动,有效检测并预防潜在的安全威胁。 本文将首先简述主机监控审计系统的基本概念,并推荐三款热门的计算机监控审计系统,其中特别介绍安企…

歌曲分享平台|基于SprinBoot+vue的原创歌曲分享平台系统(源码+数据库+文档)

原创歌曲分享平台 目录 基于SprinBootvue的原创歌曲分享平台 一、前言 二、系统设计 三、系统功能设计 5.1平台功能模块 5.2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码…

ChatGPT协助论文写作各阶段指令示例

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术论文写作过程中,我们经常面临选题、文献综述、研究设计、数据分析、写作润色等多方面的挑战。人工智能技术的发展为这些挑战提供了新的解决方案。ChatGPT作为一款强大…

Qt:玩转QPainter序列三

前言 接着序列三,图像的合成模式。 图像的合成模式(CompositionMode)是在讲述当多个图像重叠时重叠部分该如何显示的问题。 正文 先看合成模式的定义,下面是分析。 1. enum CompositionMode 这个枚举类型CompositionMode定义了多种图像合成模式。图…

AI作曲工具真的这么神奇?新手也能出音乐!

AI音乐创作工具不仅让专业音乐人有了更多灵感来源,也让普通人能够轻松实现自己的音乐梦想。本文将带你了解如何使用这些工具创作出属于自己的音乐作品。 选择适合的AI音乐创作工具 首先,你需要找到一个适合自己的AI音乐创作平台。市场上有许多选择&…

算法学习019 BFS实现迷踪步 c++算法学习 中小学算法思维学习 比赛算法题解 信奥算法解析

CBFS实现迷踪步 一、题目要求 1、编程实现 有一个 n 行 m 列的方格迷宫,用 0 表示可以通过,用 1 表示不可以通过,每一步可以向上、下、左、右任意方向移动一格,请计算从左上角(1,1)位置移动到右下角(n,m)…

算法的学习笔记—序列化二叉树(牛客JZ37)

😀前言 二叉树是数据结构中的一个重要概念,它在各种算法和应用中广泛使用。然而,当我们需要将二叉树保存到磁盘或在网络中传输时,需要将其转化为一种可存储和传输的格式——这就是序列化的作用。反之,反序列化则是将这…

一款好用且免费的PDF编辑软件:PDFelement

PDFelement是一款多功能的PDF编辑器,可以阅读、编辑、扫描、注释、转换、签名、合并、加密和打印PDF文档。 软件截图: 该版本已授权,可以使用全部功能。 使用说明: 1、将压缩文件解压到某固定位置,不要随意移动&…

视频质量诊断服务 视频质量诊断工具 图像/视频质量分析服务及工具 深度学习视频质量分析系统

文章目录 概要Mongoose介绍算法单机版测试工具算法服务的使用方法小结 概要 根据客户的需求,基于Mongoose平台搭建了视频质量服务系统,该系统主要的功能包含生成base64图像数据、接收post的数据参数推送、视频质量算法分析以及处理结果的推送功能&#x…