promise之我见

在我们平时的方法中有很多方法是promise封装的,

有些函数后边跟的then和catch 就是promise的方法,先看一下pormise的特点

 

(1)对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

 

 上边这句话摘自阮一峰老师的博客    但是讲是讲出来了,总感觉有些朦胧,深挖一下,上图看看这个promise里边到底都有什么

 

 

需要注意的是Promise 的首字母要大写 因为是构造函数 不然会报错 ,之前犯过这样的错误,找了好久,提醒一下

 

 

 

 promise的三种状态

 

 PromiseValue 用法

 

 

上边说了catch和then,一个接收成功一个接收失败,promise里边还有一个finally方法,他是不管成功还是失败只要promise执行完毕这个函数都会被执行

 

 

 

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。

Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected

只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。

如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

 

那么讲了这么一大堆  这个promise他到底有什么用处呢,就是为了解决回调地狱,之前在网上看到过这么一个图片

 

这代码看起来是不是很酸爽,回调一层套一层,多了的话感觉就是一个大型的冲击波,冲击着js开发者的心灵

 

举个例子

 

 

but到这里貌似和回调没有什么毛区别  ,他的优势体现在哪里,so 看图

 

 

打印了一下then方法   发现里边还是一个promise,所以说return的结果可以继续被.then,且结果可以继续被调用

如果用回调的话就会造成回调地狱现象

promise的话大大的降低了维护成本和让代码看起来更优雅

 

promise除了原型链上的方法之外还有一些他本身的方法,如下图

 

 

promise.all()

这个方法允许传入一个数组 他会执行里边所有的promise实例  如果传入的不是promise也会被转换成promise

并且只有在传入的所有的参数都返回resovled的时候all()方法才会是resolve,其中有一个参数是rejected的话

all()方法状态就是变成rejected

 

promise.race()

这个方法相对于上边的all()而言,它更像是比赛跑,他会返回第一个执行完毕的promise实例的状态

 

promise.resolve()

这个方法会把一个对象创建成一个promise对象并return出resolve状态出来

如果传进去的是一个promise对象的话  那么就会被直接return出来并执行resolve

 

 

promise.reject()

同理

该方法也会返回一个新的 Promise 实例,该实例的状态为rejected并执行reject

 

 

如有不足之处请大家批评指正

 

转载于:https://www.cnblogs.com/netUserAdd/p/10449873.html

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

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

相关文章

CPP虚析构函数

#include<iostream> using namespace std;class base {public:base(){};virtual ~base(){}; };// 在类声明中声明纯虚析构函数 //base::~base() {}class father: public base {public:~father(){cout << "father" << endl;} };int main() {base* a…

idea 新建springboot 的 web 项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 IDAE中新建web项目见&#xff1a;IntelliJ IDEA中新建JAVA WEB项目、maven项目 默认已有一个 maven 的 web 项目&#xff1a;gentle --…

从全栈式解决方案到情感化,揭秘问众智能切入车载语音市场的最佳姿势...

*问众智能CEO张亚 如果说语音交互是车载场景的最佳方式&#xff0c;未来谁掌握车内语音交互“话语权”&#xff0c;谁就将主宰车辆智能网联的新时代。 经过多年的渐进式发展&#xff0c;语音交互的价值正逐步走出单纯“控制方式”的狭隘理解&#xff0c;向业内人眼中的“智能…

阿里云日志添加要查询字段

第一步&#xff1a;在API基控制器&#xff08;base文件下&#xff09;下面 $arr 就是我要接受的所有参数值&#xff0c;而 msg_id就是我以后要在阿里云日志中查询的字段&#xff0c;以此字段统计某些数据 $arr 是前台API接口传过来的数据 &#xff0c;这里我需要使用 $arr[id] …

总理整节从事量化交易员所做工作与代码

数据获取&#xff08;期权数据&#xff09; 本人从事领域为量化期权领域&#xff08;皇冠上的明珠&#xff0c;真好听&#xff0c;可是做起来&#xff0c;难度真是&#xff08;滴-------------&#xff09;&#xff09;。从最开始的手动从三大所复制粘贴期权数据&#xff0c;到…

Docker 上安装、启动 MySQL (图解)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 在docker仓库中搜索mysql的镜像&#xff1a; docker search mysql 下载镜像&#xff1a; docker pull mysql 2. 查看本地镜…

关于 std::set/std::map 的几个为什么

2013-01-20 std::set/std::map &#xff08;以下用 std::map 代表&#xff09; 是常用的关联式容器&#xff0c;也是 ADT&#xff08;抽象数据类型&#xff09;。也就是说&#xff0c;其接口&#xff08;不是 OO 意义下的 interface&#xff09;不仅规定了操作的功能&#xff…

HDU 3572 Task Schedule

传送门 作业调度&#xff0c;这道题还真没想到能用网络流。。。。乍一看跟背包问题差不多。 有N个作业&#xff0c;M个机器&#xff0c;每个作业给你一个耗费时间&#xff08;时间段&#xff09;以及最早开始时间和最晚完成时间&#xff08;这两个是时间点&#xff09;&#xf…

MariaDB安装1,2

2019独角兽企业重金招聘Python工程师标准>>> 4.22 MariaDB安装 MariaDB是MySQL的一个分支。MySQL——>sun——>Oracle&#xff0c;维基百科&#xff1a;https://en.wikipedia.org/wiki/MariaDB 官网&#xff1a;https://mariadb.org MariaDB 10.3.11Linux64位…

CentOS 7 上 Docker 安装

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Docker支持以下的CentOS版本&#xff1a; CentOS 7 (64-bit)CentOS 6.5 (64-bit) 或更高的版本前提条件 目前&#xff0c;CentOS 仅发…

C/C++拾遗录--关于一个C语言小程序的分析

虽然编了几年程序&#xff0c;但是对于程序到底是什么规则变成汇编代码的&#xff0c;在这里搞了一个小程序。用VC查看了一下汇编代码。在此之前先介绍一下关于函数运行是堆栈变化的细节。 在高级语言编写程序时&#xff0c;函数的调用是很常见的事情&#xff0c;但是在函数调…

重命名 docker 容器名

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 docker 容器&#xff08;服务&#xff09;重命名只要一个命令就可以&#xff1a;docker rename 原容器名 新容器名 如&#xff1a;

vim编辑器常用命令总结

在命令状态下对当前行用 &#xff08;连按两次&#xff09;, 或对多行用n&#xff08;n是自然数&#xff09;表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n排版&#xff0c;相当于一般IDE里的code format。使用ggG可对整篇代码进行排版。 vim 选择文本&…

Docker 从Dockerfile 构建镜像 :build 命令的用法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Dockerfile 创建完成后&#xff0c;可以使用 docker build 命令根据 Dockerfile 构建一个镜像。 1. 首先准备好 Dockerfile : 2. 执行构…

如何保证MongoDB的安全性?

上周写了个简短的新闻《MongoDB裸奔&#xff0c;2亿国人求职简历泄漏&#xff01;》&#xff1a; 根据安全站点HackenProof的报告&#xff0c;由于MongoDB数据库没有采取任何安全保护措施&#xff0c;导致共计202,730,434份国人求职简历泄漏。然后很多人评论说MongoDB躺枪了。 …

Docker:集装箱式“运输”在软件上的实现

Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎&#xff0c;Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行&#xff0c;包括本地开发机器&#xff0c;生产环境&#xff0c;虚拟机和云等。 Docker基…

如何使用Dockerfile构建镜像

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Dockfile是一种被Docker程序解释的脚本&#xff0c;Dockerfile由一条一条的指令组成&#xff0c;每条指令对应Linux下面的一条命令。Doc…

小程序 公众号/h5相互跳转-webview

小程序与h5的跳转 前提小程序管理后台配置域名白名单&#xff0c;并且h5页面是嵌在小程序里面&#xff08;相互跳的前提条件&#xff09; 在业务域名中设置好访问的h5地址 微信官方web-view 介绍地址 https://developers.weixin.qq.com/miniprogram/dev/component/web-view.ht…

并行计算的专访

摘要&#xff1a;社区之星第9期采访的嘉宾是香港浸会大学计算机在读博士、浪潮高性能计算顾问赵开勇。此次他为我们揭开了高性能计算的神秘面纱&#xff0c;为读者讲解自己的经验心得。并且他认为基于移动设备的高性能计算将会成为未来潮流&#xff0c;低功耗、高性能也将成为一…

freemarker 从 spring boot execute jar可执行jar中访问模板文件

2019独角兽企业重金招聘Python工程师标准>>> private static Configuration freemarkerCfg null;static {freemarkerCfg new Configuration();//freemarker的模板目录try {String pathPrefix "/";// 为了支持能从execute jar 中获取模板文件URI uri C…