Promise搞不懂,看这篇就明白了

Promise搞不懂,看这篇就明白了

Promise 是异步编程的一种解决方案,实质上Pomise是个对象,用来封装异步操作,可以更加优雅的书写复杂的异步任务。
具体来看他是怎么工作的:
Promise语法格式

new Promise(function (resolve, reject) {
  // resolve 表示成功的回调
  // reject 表示失败的回调
	}).then(function (res) {
	  // 成功的函数
	}).catch(function (err) {
	  // 失败的函数
    })
//第二种写法
  const promise = new Promise((resolve,reject)=>{})
   promise.then((res)=>{
       //成功执行的函数
      console.log('success',res);
   }).catch((err)=>{
       //失败执行的函数
       console.log('fail',err);
   })

出现了new关键字,就明白了Promise对象其实就是一个构造函数,是用来生成Promise实例的。能看出来构造函数接收了一个函数作为参数,该函数就是Promise构造函数的回调函数,该函数中有两个参数resolve和reject,这两个参数也分别是两个函数!
举个栗子:
有个异步函数setTimeout,1秒之后执行,返回成功的状态。

       const promise = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(" excute sucess!")
            }, 1000);
        })
        promise.then((res)=>{
            console.log("success", res)
        }).catch((error)=>{
            console.log("failed",error)
        })

控制台获取到的信息:
在这里插入图片描述
resolve函数的目的是将Promise对象状态变成成功状态,在异步操作成功时调用,将异步操作的结果,作为参数传递出去。进入then中执行,
进一步看,如果resolve参数是一个函数,则需要这个函数有返回值,否则res得到的会是undefined

 	   function HandleSuccess(){
            msg.value=100
           return msg.value
        }
         const promise = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(HandleSuccess())
            }, 1000);
        })
        promise.then((res)=>{
            console.log("success", res)
        }).catch((error)=>{
            console.log("failed",error)
        })

在这里插入图片描述
当resolve的参数是一个函数,但是没有返回值时,promise当然也获取不到返回值,是undefined

   		function HandleSuccess(){
            msg.value=100
        }
          const promise = new Promise((resolve,reject)=>{
            setTimeout(() => {
                resolve(HandleSuccess())
            }, 1000);
        })
        promise.then((res)=>{
            console.log("success", res)
        }).catch((error)=>{
            console.log("failed",error)
        })
        

在这里插入图片描述
当拒绝承诺时,则会进入catch中:

   		function HandleError(){
            console.log("error ")
            msg.value="warning"
            return msg.value;
        }
         const promise = new Promise((resolve,reject)=>{
            setTimeout(() => {
                reject(HandleError())
            }, 1000);
        })
        promise.then((res)=>{
            console.log("success", res)
        }).catch((error)=>{
            console.log("failed",error)
        })

在这里插入图片描述
下方图可以快速理解:Promise对象中自带两个方法then和catch,这两个方法会分别再传入一个回调函数,这个回调函数的目的在于返回你所需要成功或失败的信息,
在这里插入图片描述

Promise链式

then方法返回的是一个新的Promise实例(注意:不是原来那个Promise实例)。因此可以采用链式写法,即then方法后面再调用另一个then方法,在then方法内调用return语句,会像构造函数里的resolve或者reject函数一样,把结果传递给下一个then方法内的函数。请看以下示例:

 	new Promise((resolve,reject)=>{
            console.log("start first request")
            setTimeout(() => {
               var data={name:"jack",value:'22'}
                resolve(data)
            }, 1000);

        }).then(res=>{
            console.log('获取第一个的结果',res)

           return res.name;
        }).then(res=>{
            console.log('获取第二个的结果',res)
        })

在这里插入图片描述
在前端的项目开发中还是在前端的面试过程中,Promise的地位就是举足轻重的,虽然解决异步编程的终极解决方案是async和await,但是它们也是基于Promise封装而来的,所以我们要了解它,需要经常去思考,有问题的欢迎补充。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习SSM的记录(八)-- SSM整合项目《任务列表案例》

前端程序搭建和运行 项目预览 接口分析 1.学习计划分页查询 需求:查询对应数据页数据 uri:schedule/{pageSize}/{currentPage} 请求方式:get 响应数据:json {"code":200,"flag":true,"data"…

基于java+springboot+vue实现的高校社团管理系统(文末源码+Lw+ppt)23-419

摘 要 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…

【C++算法模板】字典树,超详细注释带例题讲解

文章目录 0)概述1)数据结构2)插入操作3)查询操作4)完整代码1. 字符数组2. 字符串 视频链接:F06 字典树(Trie) 0)概述 是快速插入和查询字符串的多叉树结构,根节点编号为0&#xff0…

Redis:使用redis-dump导出、导入、还原数据实例

redis的备份和还原,借助了第三方的工具,redis-dump 1、安装必要环境 yum -y install zlib-devel openssl-devel2、安装redis-dump 安装ruby: ruby下载地址:https://www.ruby-lang.org/zh_cn/downloads/ 我下载的是 2.5.0 版本…

Linux系统下基于VSCode和Cmake进行C++开发

目录 简介一、GCC编译器1.1创建cpp文件1.2编译过程1.3g重要编译参数 二、GDB调试器三、IDE-VScode3.1 VSCode常用快捷键3.2 swap测试 四、CMake4.1CMake介绍4.2 CMake语法特性介绍4.3 CMake重要指令和常用变量4.4 CMake编译流程4.5CMake代码实践 五、使用VSCode进行完整项目开发…

Gateway网关在url参数带有特殊字符的情况下转发失败(响应400)

本文主要分享了,SpringCloud Gateway网关在url参数带有空格或者特殊字符的情况下,转发失败导致响应错误码400的解决方案。 响应400错误码的2种场景: 1.参数带空格,Gateway会误认为该空格是切割符,如?phone 135****6…

B/S基于云计算的云HIS智慧医院管理系统源码带电子病历编辑器

目录 一、系统概述 二、开发环境 三、系统功能 1、门诊部分 2、住院部分 3、电子病历 4、药物管理 5、统计报表 6、综合维护 7、运营运维 云HIS系统:病案首页 云his系统源码 SaaS应用 功能易扩 统一对外接口管理 现如今,大数据、云计算、移动…

深入浅出计算机网络 day.2 概论⑥ 计算机网络体系结构

上帝疯狂杜撰世界悲情的命题 将凉薄和荒芜尽写 —— 24.3.13 内容概述 1.常见的三种计算机网络体系结构 2.计算机网路体系结构分层的必要性 3.计算机网络体系结构分层思想举例 4.计算机网络体系结构中的专用术语 一、常见的三种计算机网络体系结构 1.OSI参考模型 …

Linux第77步_处理Linux并发的相关函数

了解linux中的“原子整形数据”操作、“原子位数据”操作、自旋锁、读写锁、顺序锁、信号量和互斥体,以及相关函数。 并发就是多个“用户”同时访问同一个共享资源。如:多个线程同时要求读写同一个EEPROM芯片,这个EEPROM就是共享资源&#x…

运行vue项目时的问题

1.问题:在终端输入:npm run serve时,弹出选择应用以打开npm 2.解决方法: 在你的终端中输入:get-command npm(第一次可能没反应 再输入一次) 根据这个路径找到npm删除即可 再次运行npm run serve

谈谈你对Java平台的理解?

从你接触 Java 开发到现在,你对 Java 最直观的印象是什么呢?是它宣传的 “Write once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于 Java 平台到底了解到什么程度?请你先停下来总结思考一下。 今天…

VSCode提交代码

VSCode提交代码方式: 先在电脑本地文件夹中打开git的bash窗口使用git clone https://github.com/xxxx/克隆仓库地址到本地,并生成一个项目的文件夹打开VSCode,点击文件按钮,打开加载项目的文件夹对于VSCode设置Git路径&#xff…

【小黑嵌入式系统第十九课】结课总结(三)——操作系统部分(RTOSμC/OS-Ⅲ程序设计基础(任务函数时间临界区通信))

上一课: 【小黑嵌入式系统第十八课】结课总结(二)——软件部分(系统架构&调试&测试&运行&系统软件设计) 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&#xff0…

迷你洗衣机排名前十名:2024年十大性能超强内衣洗衣机优选

随着现在的生活水平的不断提高,高科技能帮我们搞定不少问题,如果你比较注重个人卫生、追求生活品质,可以考虑选择一台专用的迷你洗衣机,我们就无须自己亲自动手去清洗内衣物,从而导致浪费时间,如果你担心孩…

Docker常见指令

1.docker search mysql :从docker镜像仓库搜索和mysql有关的镜像 docker search mysql 2.docker pull mysql :从docker仓库拉取mysql镜像 docker pull mysql 3.docker run mysql :启动mysql镜像 docker run mysql 4.docker ps &#xff…

iconfont 字体应用

1、登录 打开阿里图标 https://www.iconfont.cn/ 2、选择心仪的图标制作 iconfont 字体。 3、图标全部选择入库之后, 点右上角的购物车。 添加到项目,是方便管理图标字体的。 也可以直接下载代码的 4、下载到本地之后,把里面的 iconfont.…

altgraph的安装和用途说明

前言 altgraph 是 graphlib 的一个分支:一个图(网络)包,用于构建图、BFS 和 DFS 遍历、拓扑排序、最短路径等,带有 graphviz 输出。 安装 pip install altgraph 函数和用例 生物链 from altgraph import Graph# 定…

linux查看服务器登录成功和登录失败的命令

last 查看成功登录服务器的信息,包括ip,时间,登录用户,时长。lastb 查看登录服务器失败的信息。 last命令实例: 其他参数: -a:把从何处登入系统的主机名称或ip地址,显示在最后一行…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1:页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题: 考点2:段式存储存储管理 - 段式存储组织例题: 考点1:页式存储 存储管理 - 页式存储组织 页式存储:将程序…

MySQL数据表的增删改查(基础)(CRUD)

1.CRUD 注释:在SQL中可以使用“--空格描述”来表示注释说明. CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写. 2.新增(Create) 语法: insert into 表名 values (值,值...); into --可以省略; values -- 关键字. 下面以一…