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详解的更多相关文章

  1. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  2. Markdown语法说明(详解版)

    ####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...

  3. ECMAScript简介以及es6新增语法

    ECMAScript简介 ECMAScript与JavaScript的关系 ECMAScript是JavaScript语言的国际化标准,JavaScript是ECMAScript的实现.(前者是后者的 ...

  4. Ubuntu14.04下Ambari安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)

    不多说,直接上干货! 写在前面的话 (1) 最近一段时间,因担任我团队实验室的大数据环境集群真实物理机器工作,至此,本人秉持负责.认真和细心的态度,先分别在虚拟机上模拟搭建ambari(基于CentO ...

  5. Ubuntu14.04下Cloudera安装搭建部署大数据集群(图文分五大步详解)(博主强烈推荐)(在线或离线)

    第一步: Cloudera Manager安装之Cloudera Manager安装前准备(Ubuntu14.04)(一) 第二步: Cloudera Manager安装之时间服务器和时间客户端(Ub ...

  6. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  7. ES6 Promise 详解

    一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...

  8. 【ES6新增语法详述】

    目录 1. 变量的定义 let const 2. 模版字符串 3. 数据解构 4. 函数扩展 设置默认值 箭头函数 5. 类的定义 class 6. 对象的单体模式 "@ ES6新增了关于变 ...

  9. ES6新增语法(一)——let、const、var的区别

    ES6简介 ES6是ECMAScript 6.0的简称,是javascript语言的下一代标准,已经在2015年6月正式发布上线.目的就是为了统一javascript的语法标准,可以用来开发大型应用程 ...

随机推荐

  1. [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入

    [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 目录 [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 0x00 摘要 0 ...

  2. Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache.org/schema/dubbo]

    dubbo的官方文档写的真好, http://dubbo.apache.org/zh-cn/docs/2.7/user/dependencies/ 在使用dubbo过程中的问题, 和解决 org.sp ...

  3. Java期末考试编程题复习

    在程序中定义Person类,为该类编写如下字段.构造器.访问器.修改器和相应的其他方法.(20分) <1>在Person类中定义两个字段: 私有访问权限,类型为String的name字段: ...

  4. docker安装nextcloud私人网盘,开启https配置证书

    docker安装nextcloud私人网盘 之前一直用的百度网盘最近svip超级会员到期了,续费要¥199元,对于一个打工人的我来说有点儿贵.作为技术人的一员,我就来发挥发挥自己的长处,来搭建一个私人 ...

  5. JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)

    好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...

  6. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  7. 【Javascript + Vue】实现随机生成迷宫图片

    前言 成品预览:https://codesandbox.io/s/maze-vite-15-i7oik?file=/src/maze.js 不久前写了一篇文章介绍了如何解迷宫:https://www. ...

  8. Golang编写Windows动态链接库(DLL)及C调用范例

    一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...

  9. Java实现工厂模式

    工厂模式(Factory),当需要根据运行时的一些条件来决定创建具体对象时,就应该考虑使用工厂设计模式,将创建对象的任务交给工厂集中处理. 工厂模式有多种写法,总体分为简单工厂模式和抽象工厂模式 工厂 ...

  10. 开发小技巧之:unicode的排序和正则匹配

    目录 简介 ASCII字符的排序 本地字符的排序 为什么不使用unicode进行排序 emoji的正则匹配 总结 简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最 ...