关于ES6的Promise

JavaScript的异步处理

提到JavaScript的异步处理,也许很多人和我一样想到利用回调函数。

例如:

firstAsync(function(data){//处理得到的 data 数据//....secondAsync(function(data2){//处理得到的 data2 数据//....thirdAsync(function(data3){//处理得到的 data3 数据//....});});
});

但是回调函数一旦嵌套层级过多,就会引发“回调地狱”的问题,而Promise作为一种异步解决方案,就可以很好的解决这个问题。

例如上面的例子用Promise实现的话:

firstAsync()
.then(function(data){//处理得到的 data 数据//....return secondAsync();
})
.then(function(data2){//处理得到的 data2 数据//....return thirdAsync();
})
.then(function(data3){//处理得到的 data3 数据//....
});

什么是 Promise?

Promise是一个对象,用于表示一个异步操作的最终状态(完成或失败),以及其返回的值。它作为ES6最重要的特性之一,目前已经被Firefox和Chrome等主流浏览器所支持,具体情况可以在Can I use里查看。如果想要做浏览器的兼容,只需要在浏览器中加载Polyfill类库即可。

Promise 的状态

  • 等待(pending):初始状态。
  • 已完成(fulfilled):意味着操作成功完成。
  • 已失败(rejected):意味着操作失败。

Promise对象的状态只可能处于这三种之一,它的状态改变只可能是两种可能:从 Pending 变为 fulfilled 和从 Pending 变为 Rejected。一旦状态发生改变,就不会再变,这也是Promise[承诺]这个名字的由来。

then 链式操作和 resolve 方法

Promise.prototype.then 方法返回的是一个新的 Promise 对象,因此可以采用链式写法。该方法接收两个参数,第一个是成功的回调,第二个是失败的回调。

下面用setTimeout模拟异步操作:

function runAsync1(){var p = new Promise(function(resolve, reject){setTimeout(function(){console.log('异步操作1执行完毕!');resolve('异步操作1成功回调数据');}, 1000);});return p;
}
function runAsync2(){var p = new Promise(function(resolve, reject){setTimeout(function(){console.log('异步操作2执行完毕!');resolve('异步操作2成功回调数据');}, 1000);});return p;
}

使用 Promise.prototype.then 方法链式调用这两个方法:

runAsync1()
.then(function(data){console.log(data);return runAsync2();
})
.then(function(data){console.log(data);
});

运行结果如下:

你也可以在 then 方法中直接return数据而不是Promise对象:

runAsync1()
.then(function(data){console.log(data);return runAsync2();
})
.then(function(data){console.log(data);return '直接返回数据'
})
.then(function(data){console.log(data)
});

运行结果如下:

reject 方法

上面我们通过 Promise.resolve() 把Promise的状态置为已完成(Resolved), 然后通过 then 方法捕捉到变化,并执行“成功”情况的回调,而 Promise.reject() 的作用就是将Promise的状态置为已失败(rejected),同样通过 then 方法来执行“失败”情况的回调。

function runAsync1(num){var p = new Promise(function(resolve, reject){  setTimeout(function(){console.log('异步操作1执行完毕!');if(num < 10) {resolve('异步操作1成功回调数据');}else{reject('异步操作1失败回调数据'); }}, 1000);});return p;
}

运行结果如下:

catch 方法

Promise.prototype.catch 和 Promise.prototype.then 方法的第二个参数一样,用来指定reject的回调,二者都返回 promise 对象, 因此都可以被链式调用。

此外 catch 还可以捕获异常:

all 方法

Promise.all(iterable) 返回一个新的promise对象,该promise对象只有在iterable参数对象里所有的promise对象都成功的时候才会触发成功,并所有promise返回值以数组的形式返回。

以上面的 runAsync1() 和 runAsync1() 为例:

Promise
.all([runAsync1(),runAsync2()])
.then(function(results){console.log(results);
});

返回结果如下:

race 方法

Promise.race() 方法,race即竞赛,顾名思义,这是一个比谁跑得快的规则。

function runAsync1(){var p = new Promise(function(resolve, reject){setTimeout(function(){console.log('异步操作1执行完毕!');resolve('异步操作1成功回调数据');}, 2000);});return p;
}
function runAsync2(){var p = new Promise(function(resolve, reject){setTimeout(function(){console.log('异步操作2执行完毕!');resolve('异步操作2成功回调数据');}, 1000);});return p;
}
Promise
.race([runAsync1(),runAsync2()])
.then(function(results){console.log(results);
});

运行结果如下:

可以看到,只要runAsync1、runAsync2中的任何一个率先改变状态,父Promise的状态就跟着改变。而那个率先改变状态的子Promise的返回值,就是传递给父Promise的返回值。

总结

Promise的基本使用方法就是这样,之前看过一篇文章,用做饭(cook)吃饭(eat)洗碗(wash)为例,形象地演示了Promise的用法,地址戳戳戳这里。

  • 参考文档

更多专业前端知识,请上 【猿2048】www.mk2048.com

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

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

相关文章

[转]我是如何走进黑客世界的?

*本文原创作者&#xff1a;MyselfExplorer&#xff1b;翻译编辑&#xff1a;楼兰&#xff0c;本文属FreeBuf原创奖励计划&#xff0c;未经许可禁止转载 我想给你一把打开这扇门的钥匙&#xff0c;而你要做的便是静静的聆听接下来的故事。挖掘 0day 一般需要掌握fuzzing&#xf…

Socket.io 深入理解

最近在做项目优化工作时&#xff0c;用到了Socket.io , Socket.io 文档比较少&#xff0c; 结合官网介绍以及自己在项目开发中的摸索&#xff0c;总结如下内容&#xff1b; Socket.io将Websocket和轮询 &#xff08;Polling&#xff09;机制以及其它的实时通信方式封装成了通用…

python填表_小Python填表得到d

我正在尝试使用Scrapy从网站自动下载数据。在我要做的是&#xff1a;使用我的凭据登录网站通过在“RIC”行中写入代码并选择感兴趣的时段来选择我想要的数据单击“获取数据”后&#xff0c;将生成.csv文件&#xff0c;我可以从“下载/”url下载该文件&#xff0c;其中我的所有文…

我理解中的“大前端”/“大无线”

本文内容较长&#xff0c;大概需要15分钟时间阅读。 内容包含五部分&#xff1a;前言&#xff0c;NodeJS职能变化&#xff0c;ReactNative的大规模应用&#xff0c;专门的架构组职能&#xff0c;总结。主要是介绍我所在团队最近的一些变化和思考。 更多信息可以加入我的小密圈关…

Dirichlet分布

1.预备知识 Beta分布函数是一种定义在实数区间[0,1]的特殊函数&#xff0c;它是二项式分布的共轭分布&#xff1b;与Beta分布相同&#xff0c;Dirichlet分布也是定义在实数区间[0,1]的概率度量函数&#xff0c;Dirichlet分布是多项式分布的共轭分布&#xff0c;Dirichlet分布的…

布局定位

布局与定位 摆放元素 1&#xff0c;使用流 流实际上就是浏览器在页面上摆放HTML元素所用的方法。浏览器从HTML文件最上面开始&#xff0c;从上到下沿着元素流逐个显示所遇到的各个元素。 每个块元素会按它在HTML标记中出现的顺序放置在页面上。每个新的块元素会带来一个换行。并…

python语言精通_Python语言基础从入门到精通

1、python关键字False await else import passNone break except in raiseTrue class finally is returnand continue for lambda tryas def from nonlocal whileassert del global not withasync elif if or yield2、命令行参数williamdeMBP-2:~ william$ python -c "imp…

FreeNAS:创建 CIFS 共享(权限)

第一部分&#xff1a;新建账户与指定数据集权限 简单起见&#xff0c;本教程主要介绍带基本身份验证的 CIFS 共享&#xff0c;即只有输入正确的用户名和密码才可以访问共享目录。关于创建匿名共享、多用户权限管理以及域控制器相关内容&#xff0c;我们会另外发布教程专门介绍。…

oracle日记账单据编号未生成_商管财务数据平台Oracle与共享未付池差异如何核对、解决?...

‍‍近期&#xff0c;总部新上线财务数据平台啦&#xff01;各个系统间的差异异常数据清晰可见&#xff0c;随时可查&#xff0c;今天就和小伙伴们一起分享一下Oracle与共享未付池差异如何核对、解决。首先&#xff0c;将Oracle与共享未付池差异数据导出。由于导出的数据包括本…

android paint 圆角 绘制_[BOT] 一种android中实现“圆角矩形”的方法

内容简介文章介绍ImageView(方法也可以应用到其它View)圆角矩形(包括圆形)的一种实现方式&#xff0c;四个角可以分别指定为圆角。思路是利用“Xfermode Path”来进行Bitmap的裁剪。背景圆角矩形实现的方法应该很多&#xff0c;网上一大堆。很怀疑为啥安卓的控件不内置这样的属…

Cisco TrustSec(理解)

1、Cisco TrustSec的限制当指定了无效的设备ID时&#xff0c;受保护的访问凭据&#xff08;Protected access credential&#xff0c;PAC&#xff09;设置将失败并保持挂起状态。 即使在清除PAC并配置正确的设备ID和密码后&#xff0c;PAC仍然会失败。作为解决方法&#xff0c;…

Java 8仍然需要LINQ吗? 还是比LINQ更好?

长期以来&#xff0c; LINQ是.NET软件工程生态系统中发生的最好的事情之一。 通过在Visual Studio 2008中引入lambda表达式和monads &#xff0c;它使C&#xff03;语言比Java&#xff08;当时的版本6&#xff09;更先进&#xff0c;并且仍在讨论泛型类型擦除的优缺点。 这项成…

web前端(12)—— 页面布局2

本篇博文&#xff0c;主要就讲定位的问题&#xff0c;也就是页面布局里最重要的&#xff0c;本篇博文不出意外的话&#xff0c;也是css的最后一篇博文了 定位&#xff0c;position属性 定位有三种&#xff1a; 相对定位绝对定位固定定位 相对定位&#xff0c;position&#x…

python pyplot中axis_Python Pyplot xaxis未显示在图形上

pyplot未在图形上显示x轴&#xff1a;import pandas as pdimport matplotlib.pyplot as pltdf pd.read_csv(sitka_weather_2014.csv)df[AKST] pd.to_datetime(df.AKST)df[Dates] df[AKST].dt.strftime(%b %d, %Y)df.set_index("Dates", inplace True)# Plot Dataf…

web前端入门学习(纯干货)

web前端怎么样才能入门&#xff0c;首先我们要从什么是初级web前端工程师说起&#xff1a; 按照我的想法&#xff0c;我把前端工程师分为了入门、初级、中级、高级这四个级别&#xff0c; 入门级别指的是了解什么是前端&#xff08;前端到底是什么其实很多人还是不清楚的&…

[校内模拟题2]

水题 但是原地螺旋炸裂 都不好意思贴代码了QWQ enc 【问题背景】 zhx 和他的妹子聊天。 【问题描述】 考虑一种简单的加密算法。假定所有句子都由小写英文字母构成&#xff0c; 对于每一个字母&#xff0c; 我们将它唯一地映射到另一个字母。 例如考虑映射规则&#xff1a;a-&g…

AJAX初识(原生JS版AJAX和Jquery版AJAX)

一、什么是JSON 1.介绍JSON独立于语言&#xff0c;是一种与语言无关的数据格式。JSON指的是JavaScript对象表示法&#xff08;JavaScript Object Notation&#xff09;JSON是轻量级的文本数据交换格式JSON具有自我描述性&#xff0c;更易理解JSON使用JavaScript语法来描述数据对…

内存不足而没有OutOfMemoryError

这实际上是最初发布于2010年的帖子的转世。 昨天&#xff0c;当听到我们的工程师咒骂一个特别令人讨厌的错误时&#xff0c;闪回发生了。 当诅咒停止时&#xff0c;我走过去核实我的怀疑。 瞧&#xff0c;我是正确的–情绪波动是由应用程序用尽了堆空间导致的&#xff0c;但死于…

人工智能第二星期总结-------纵里寻它千百度

2018-07-28 第二周&#xff1a; 此时此刻我怀着无比沉重的心情在这里做一周的学习检讨工作 这星期依此就开始讲到了函数&#xff0c;话说函数可是python里面的钟头戏&#xff0c;不仅可以节约代码&#xff0c;还可以把代码重复使用&#xff0c;只要后面轻轻松松就可以搞定啦&am…

个人作业——软件产品案例分析

个人作业——软件产品案例分析 第一部分 调研&#xff0c;评测 评测&#xff1a; 第一次上手体验 第一眼看上去功能很全面&#xff0c;但是到点开来发现功能大部分没有实现&#xff0c;体验不太好。 缺陷Bug情况 课表查询 bug描述&#xff1a;课表查询没有课表结果,点进去当前周…