ES6新增语法(五)——Promise详解
Promise介绍
promise是一个对象,从它可以获取异步操作的消息。有all、race、reject、resolve这几个方法,原型上有then、catch等方法。
Promise的两个特点:
- 对象的状态不受外界影响。Promise对象获取的是异步操作,有三种状态:pending(进行中)、fulfilled(已成功)、reject(已失败)。除了异步操作的结果,其他操作都无法改变这个状态。
- 一旦状态改变,就不会再变。从pending变为fulfilled和从pending变为rejected状态,只要处于fulfilled和rejected,状态就不会再变。
状态的缺点:
无法取消Promise,一旦新建它就会立即执行,无法中途取消。
如果不设置回调函数,Promise内部抛出错误,不会反应到外部。
当处于pending状态时,无法得知目前进展到哪一阶段。
使用语法:
let p = new Promise( (resolve,reject)=>{
//resolve 和reject是两个函数
})
p.then(
()=>{}, // 传入的resolve函数,resolve翻译成中文是解决
()=>{} //传入的reject函数,reject翻译成中文是拒绝
).catch((reason,data)=>{
console.log("catch失败执行回调抛出原因",reason)
})
then方法
then方法接收两个参数作为参数,第一个参数是Promise执行成功时的回调,第二个参数是Promise执行失败的回调,两个函数只会有一个被调用。
通过.then添加的回调函数,不论什么时候,都会被调用,而且可以添加多个回调函数,会一次按照顺序并且独立运行。
const p =new Promise((resolve,reject)=>{
resolve("成功")
})
p.then((res)=>{
console.log(res)//返回成功
},(err)=>{
console.log(err)
})
带有多个回调函数时
const p =new Promise((resolve,reject)=>{
resolve(1)
})
p.then((res1)=>{
console.log('res1',res1) // 1
return res1 * 2;
}).then((res2)=>{
console.log('res2',res2) //2
}).then((res3)=>{
console.log('res3',res3) //undefined
return Promise.resolve('resolve')
}).then(res4=>{
console.log('res4',res4) //resolve
})
catch用法
与Promise对象方法then并行的还有一个catch方法,用来捕获异常的,与try...catch类似,
const p1 = new Promise((resolve,reject)=>{
var num = Math.random()*10 ;//随机生成一个0-10的数字
console.log("num",num)
if(num > 5){
resolve('大于5')
}else{
reject("小于5")
}
})
p1.then(res=>{
console.log("res",res) // res 大于5
}).catch(err=>{
console.log("err",err) // err 小于5
})
all方法
all方法表示所有的异步操作完成后才执行回调,返回结果,返回的数据是个数组,多个请求返回的数据组合。与then方法同级。
使用语法:Promise.all([ p,p1,p2.... ]).then()
使用实例如下:
const p1 = new Promise((resolve,reject)=>{
resolve({
name:'倩倩'
})
})
const p2 = new Promise((resolve,reject)=>{
resolve(['a','b'])
})
const p3 = new Promise((resolve,reject)=>{
resolve('二傻子')
})
Promise.all([p1,p2,p3]).then(res=>{
console.log(res)//[{name:'倩倩'}, ['a','b'], "二傻子"]
})
race方法
all是等所有的异步操作都执行完成了再执行回调,而race方法是相反的,只要有一个执行完成,不论结果是成功还是失败,都开始执行回调,其余的不会再进入race的回调。返回的数据取决于最早执行完毕返回的数据。
const p1 = new Promise((resolve,reject)=>{
resolve({
name:'倩倩'
})
})
const p2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(['a','b'])
},1000)
})
const p3 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('二傻子')
},2000)
})
Promise.race([p1,p2,p3]).then(res=>{
console.log(res)//{name:'倩倩'}
})
为什么使用Promise?
Promise的优点
- 指定回调函数的方式更加灵活。
- 支持链式调用,可以解决回调地狱问题。回调地狱就是回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数的执行条件。回调地狱的缺点是不便于阅读和异常处理。
Promise的缺点
- 无法取消Promise,一旦新建就会立即执行,无法暂停和取消。
- 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
- 当处于pending(进行中)状态时,无法得知目前进展到哪一个阶段。
ES6新增语法(五)——Promise详解的更多相关文章
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- Markdown语法说明(详解版)
####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...
- ECMAScript简介以及es6新增语法
ECMAScript简介 ECMAScript与JavaScript的关系 ECMAScript是JavaScript语言的国际化标准,JavaScript是ECMAScript的实现.(前者是后者的 ...
- Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)
不多说,直接上干货! 写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentO ...
- Ubuntu14.04下Cloudera安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)(在线或离线)
第一步: Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一) 第二步: Cloudera Manager安装之时间服务器和时间客户端(Ub ...
- ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))
1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...
- ES6 Promise 详解
一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...
- 【ES6新增语法详述】
目录 1. 变量的定义 let const 2. 模版字符串 3. 数据解构 4. 函数扩展 设置默认值 箭头函数 5. 类的定义 class 6. 对象的单体模式 "@ ES6新增了关于变 ...
- ES6新增语法(一)——let、const、var的区别
ES6简介 ES6是ECMAScript 6.0的简称,是javascript语言的下一代标准,已经在2015年6月正式发布上线.目的就是为了统一javascript的语法标准,可以用来开发大型应用程 ...
随机推荐
- PointRCNN: 点云的3D目标生成与检测
PointRCNN: 点云的3D目标生成与检测 PointRCNN: 3D Object Proposal Generation and Detection from Point Cloud 论文地址 ...
- 实时双频Wi-Fi如何实现下一代车内连接
实时双频Wi-Fi如何实现下一代车内连接 How real simultaneous dual band Wi-Fi enables next-generation in-vehicle connec ...
- CentOS:操作系统级监控及常用计数器解析---除CPU以外
I/O I/O 其实是挺复杂的一个逻辑,但我们今天只说在做性能分析的时候,应该如何定位问题. 对性能优化比较有经验的人(或者说见过世面比较多的人)都会知道,当一个系统调到非常精致的程度时,基本上会卡在 ...
- PyQt5开发实践(一、准备篇)
前言 近一年来我开发了不少PyQt小项目,因为之前没用过使用C++语言的Qt,所以可以算是从零基础开始边学边做的,这个过程中再一次体会到国内技术社区的匮乏-- 国内关于PyQt的资料说少不少,说多也不 ...
- P2365 任务安排
题目描述 n 个任务排成一个序列在一台机器上等待完成(顺序不得改变),这 n 个任务被分成若干批,每批包含相邻的若干任务. 从零时刻开始,这些任务被分批加工,第 i 个任务单独完成所需的时间为 ti ...
- 四、SSL虚拟证书
沿用练习三,配置基于加密网站的虚拟主机,实现以下目标: 域名为www.c.com 该站点通过https访问 通过私钥.证书对该站点所有数据加密 4.2 方案 源码安装Nginx时必须使用--with- ...
- centos7 配置国内yum源
配置清华大学镜像仓库 URL:https://mirrors.cnnic.cn/ CentOS 镜像使用帮助 https://mirrors.cnnic.cn/help/centos/ 建议先备份 C ...
- 在VScode 中使用RT-Thread Studio初体验
前言 工欲善其事,必先利其器,VScode是什么东东,想必大家都非常熟悉了,丰富的插件,有好的开发界面,是很多程序开发者的不二之选,RT-Thread竟然也开发了Vscode插件,真的是非常的nice ...
- 宝,我今天CR了,C的什么R? 走过场的CR
原创:猿天地(微信公众号ID:cxytiandi),欢迎分享,转载请保留出处. CodeReview我相信目前很多公司都会有这么一个流程,关键是这个流程有没有用就很难讲.主要还是取决于你对CR的理解以 ...
- 每日三道面试题,通往自由的道路5——JVM
茫茫人海千千万万,感谢这一秒你看到这里.希望我的面试题系列能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! 每日三道面试题,成就更好自我 昨天既然我们聊到了JVM,那我们继续这一个话题 ...