十分钟快速了解 ES6 Promise

转载自 十分钟快速了解 ES6 Promise

什么是Promise

Promise最早由社区提出并实现,典型的一些库有Q,when, bluebird等;它们的出现是为了更好地解决JavaScript中异步编程的问题,传统的异步编程最大的特点就是地狱般的回调嵌套,一旦嵌套次数过多,就很容易使我们的代码难以理解和维护。而Promise则可以让我们通过链式调用的方法去解决回调嵌套的问题,使我们的代码更容易理解和维护,而且Promise还增加了许多有用的特性,让我们处理异步编程得心应手。


如何创建Promise

ES6给我们提供了一个原生的构造函数Promise,我们可以看一下这个构造函数:

 

下面我们先来创建一个promise,下面是一个简单的示例:

 

下面来解释一下上面的代码:

【1】因为Promise是一个构造函数,所以我们使用了new操作符来创建promise。

【2】构造函数Promise的参数是一个函数(暂时叫它func),这个函数(func)有两个参数resolve和reject,它们分别是两个函数,这两个函数的作用就是将promise的状态从pending(等待)转换为resolved(已解决)或者从pending(等待)转换为rejected(已失败)。

【3】创建后的promise有一些方法,then和catch。当然我们也可以人为的在Promise函数上添加一些满足我们自己需求的方法,方便每一个promise对象使用。

如果我们使用一些ES6的语法的话,我们上面的代码会更加简洁:

 

其实可以这样理解,Promise函数体的内部包裹着一个异步的请求或者操作或者函数;然后我们可以在这个异步的操作完成的时候使用resolve函数将我们获得的结果传递出去,或者使用reject函数将错误的消息传递出去。


Promise对象的一些方法

Promise对象可以通过使用then方法将上一步返回的结果获取过来(不管是resolved还是rejected),可以通过使用catch方法捕获Promise对象在使用catch之前的异常。

首先来说一下then方法的使用:

 

我们可以看到,then方法可以接受两个函数作为参数,第一个函数是用来处理resolve的结果,第二个是可选的,用来处理reject的结果。也就是说,我们在创建p这个Promise对象的时候,通过函数resolve传递出去的结果可以被p的第一个then方法中的第一个函数捕获然后作为它的参数。通过函数reject传递出去的结果可以被p的第一个then方法中的第二个函数捕获然后作为它的参数。

当然我们还可以在每一个then方法中创建新的Promise,然后将这个Promise对象返回,之后我们就可以在后面的then方法中继续对这个对象进行操作。下面是一个简单的例子:

 

从上面的代码中我们可以看到,一旦创建一个Promise对象之后,我们就可以使用then方法来进行链式的调用,而且我们可以把每一次的结果都返还给下一个then方法,然后在下一个then方法中对这个值进行处理。每一个then方法中都可以再次新创建一个Promise对象,然后返还给下一个then方法处理。

Promise还有另一个方法catch,这个方法其实是then方法的一种特例,这个特例就是:

.then(null, rejection)

相当于我们不使用then方法的第一个函数,只是用第二个函数;catch函数比较简单,就是用来捕获之前的then方法里面的异常,我们可以简单的来看一个例子:

 

上面代码的输出结果如下:

progress...
VM141:9 Error: fail(…)

我们可以使用catch函数来捕获整个then函数链中的异常。


Promise的一些方法

Promise.all方法用来包装许多个Promise实例,然后组成了一个新的Promise对象,新的Promise对象的状态由前面几个被包裹的Promise对象的状态决定,如果前面的Promise都被resolve了,那么新的Promise的状态也是resolve的;只要有一个Promise被reject了,那么组成的新的Promise的状态也是reject的。

可以看下面一个例子:

 

上面的代码的输出结果如下:

[ Promise { <pending> },Promise { <pending> },Promise { <pending> } ]
[ 1, 2, 3 ] // 3s后输出的结果

Promise.race方法和上面的Promise.all有点类似,都是包装许多的Promise对象,然后组成了一个新的Promise对象,但是使用Promise.race的含义是:只要包裹的的Promise对象中有一个的状态发生了改变,那么组成的这个新的Promise对象的状态就是上面那个率先改变的Promise实例的状态。

下面是一个简单的例子:

 

上面程序的输出结果如下:

[ Promise { <pending> },Promise { <pending> },Promise { <pending> } ]
1 // 是最先改变状态的那个Promise实例resolve的值

Promise.resolve方法主要是将一个值转变为一个Promise对象,然后使它具有Promise的一些方法和特性,为了满足我们一些特殊情况下的要求。

下面是一个简单的例子:

 

上面的输出结果如下:

[ null, 0, 'hello', { then: [Function: then] } ]a thenable obj // Promise.resolve方法会将具有then方法的对象转换为一个Promise对象,然后就立即执行then方法。

Promise.reject方法和Promise.resolve方法一样,只不过通过Promise.reject方法产生的Promise对象的状态是rejected的,下面是一个示例:

let p = Promise.reject('fail');
p.catch((err) => {console.log(err);
}); // fail

上面的内容把ES6中新增的Promise的基本使用方法给大家讲了一下,希望对大家有多帮助。

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

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

相关文章

揭示.NET Core和.NET Standard

作为.NET家族的最新成员&#xff0c;有很多关于.NET Core和.NET Standard的误解&#xff0c;以及它们于.NET Framework之间的区别。在这篇文章&#xff0c;我会准确的解释他们究竟是什么&#xff0c;并看看何时应选择哪一个。在详细介绍之前&#xff0c;首先查看.NET的结构图&a…

使用wxjava实现发表内容、预览信息以及推送文章

大家好&#xff0c;我是雄雄。 文章目录前言保存草稿的方法获取草稿箱列表根据media_id获取草稿箱信息给指定人发送预览文章推送文章&#xff08;按照标签推送&#xff09;前言 今天分享的内容有如下几个&#xff1a; 保存草稿根绝media_id会哦去草稿箱的信息发表内容&#x…

指针数组(三)

#include<stdio.h>void g(int *pArr,int len){pArr[2]88;pArr[4]88;}void f(){int a[]{1,2,3,5,9},i;g(a,5);for(i0;i<5;i){printf("%d\t",a[i]);}}main(){f();}利用指针改变数组里的内容和内容

spring cloud+dotnet core搭建微服务架构:服务发现(二)

前言上篇文章《手把手教你使用spring clouddotnet core搭建微服务架构&#xff1a;服务治理&#xff08;-&#xff09;》实际上只讲了服务治理中的服务注册&#xff0c;服务与服务之间如何调用呢&#xff1f;传统的方式&#xff0c;服务A调用服务B&#xff0c;那么服务A访问的是…

猿创征文|公众号开发之路——为了研究公众号,我注册了公司

大家好&#xff0c;我是雄雄。 内容先知&#x1f60a;1.前言&#x1f636;2.想法&#x1f913;3.注册及研究&#x1f4aa;4.注册公司现在是北京时间&#xff1a;2022年9月10日23:34&#xff0c;农历八月十五日&#xff0c;2022年的教师节&#xff0c;也是中秋节&#xff0c;祝大…

动态数组(四)

#include<stdio.h>void f(int *q){*q200;}main(){int *p(int *)malloc(sizeof(int));*p10;printf("%d\n",*p);f(p);printf("%d\n",*p);}动态数组应用&#xff1a;&#xff08;记得导入#include<malloc.h>&#xff09; #include<stdio.h>…

Docker 实战笔记

Docker的安装与配置CentOS前提条件目前&#xff0c;CentOS 仅在发行的版本中的内核支持DockerDocker 运行在CentOS 7 上要求系统为64位&#xff0c;系统内核版本在3.10以上。本次测试运行使用的是 centOS 7.2 64位的系统版本。使用代码 uname -r即可查看系统内核版本Docker软件…

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

转载自 JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解 现实企业级Java开发中&#xff0c;有时候我们会碰到下面这些问题&#xff1a; OutOfMemoryError&#xff0c;内存不足 内存泄露 线程死锁 锁争用&#xff08;Lock Contention&#xff09; Java进…

jeecg微服务中如何实现机构的概念(当前机构只能查到其子机构)

大家好&#xff0c;我是雄雄。 内容先知前言代码实现前言 以前&#xff0c;我们做的国家平台项目&#xff0c;都是采用现在开源的框架来做的&#xff0c;比如若依&#xff0c;bladex&#xff0c;相比之下&#xff0c;若依用的要稍多点儿。因为那时候刚开始接触vue&#xff0c;…

初学结构体(一)

#include<stdio.h>struct Student{int age;float score;char sex;};main(){struct Student st{25,88,M};printf("%d\n",st.age); struct Student *pst&st;pst->age100;printf("%d\n",st.age);printf("%d",pst->age); }构造结构…

.NET Conf 2017后初尝Xamarin Forms 3.0@Linux

对很多.NET粉&#xff0c;.NET Conf 2017的东西估计提前一个月都熟悉了&#xff0c;Xamarin粉估计最大惊喜不是Xamarin Live Player, 也不是Xamarin.Forms混合NativeControl &#xff0c;而是Xamarin.Forms 3.0&#xff0c;因为它融入到 Linux平台. Xamarin.Forms 跨平台&#…

Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

转载自 Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比 redis作为一种高效的缓存框架&#xff0c;使用是非常广泛的&#xff0c;在数据存储上&#xff0c;在运行时其将数据存储在内存中&#xff0c;以实现数据的高效读写&#xff0c;并且根据定制的持久化规则…

微信小程序中使用画布canvas实现动态心电图绘制

大家好&#xff0c;我是雄雄。 内容先知前言效果图实现代码前言 近期&#xff0c;接了个项目&#xff0c;三端&#xff08;小程序、PC、公众号&#xff09;同步开发&#xff0c;PC端没的问题&#xff0c;以前一直做的就是PC端&#xff0c;但是小程序和公众号之前没有做过&…

nssl1163-小x游世界树【树形dp,二次扫描和换根法】

正题 题目大意 一棵树&#xff0c;一条边的权是原本的权值减去出发点的加速。 求一个点使得这个点到所有点路径边权和最小。 解题思路 我们先求出以1为根时的答案 然后用换根法 我们从1转移到2&#xff0c;我们会发现 红色的部分的路径都减去的紫色的路径长度&#xff0c;蓝…

结构体跨函数应用(二)

#include<stdio.h> struct Student { int age;char sex; };int main(void){struct Student st;InputStudent(&st);printf("%d,%c",st.age,st.sex);}void InputStudent(struct Student *pstu) {(*pstu).age88;pstu->sexF;}老是出现警告&#xff0c;排查好…

ASP.NET Core依赖注入解读使用Autofac替代实现

1. 前言关于IoC模式&#xff08;控制反转&#xff09;和DI技术&#xff08;依赖注入&#xff09;&#xff0c;我们已经见过很多的探讨&#xff0c;这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection 模式》&#xff0c;相关资料链接都附于文章末尾…

jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)

大家好&#xff0c;我是雄雄。 内容先知前言软件获取开始测试1.新建线程组2.创建一个请求3.添加HTTP信息头4.开始测试5.查看请求情况前言 上头问题要服务器的配置&#xff0c;基于我们现在做的项目&#xff0c;需要安排别人去采购服务器&#xff0c;给出的消息是&#xff1a;2…

开封游(一)

今天去开封玩了一下&#xff0c;白天在路程上耽搁太多时间&#xff0c;主要在晚上玩的。终于到显示我米9夜景功能的时候了。 去了包公祠&#xff0c;西司夜市&#xff0c;鼓楼夜市。 下午先去了包公祠 下面是夜景了&#xff0c;特别的炫酷。 首先是西司夜市 进去的时候 这个…

C#中的两把双刃剑:抽象类和接口

问题出现&#xff1a;我们在使用C#的抽象类和接口的时候&#xff0c;往往会遇到以下类似的问题&#xff0c;大致归纳如下:(1)抽象类和接口有什么本质的区别和联系&#xff1f;(2)什么时候选择使用抽象类&#xff0c;然啥时候使用接口最恰当呢&#xff1f;(3)在项目中怎样使用才…

开封游(二)

短暂的永远浪漫&#xff0c;漫长换来不满。人就是这样&#xff0c;第一天是怀着期盼喜悦的心情来的&#xff0c;等到二天&#xff0c;被漫长的行程磨平心境后就再也不想出来旅游了。 总之第二天的心情只能用疲倦来概括。 本来愉悦的心情&#xff0c;而转折点是在吃完海底捞之…