Promise对象,究竟为何物?
Promise对象
一、什么是Promise?
- Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来。
- Promise避免了多级异步操作的回调函数嵌套。
- Promise最早是一个函数库,现在已经被ES6写入标准用法。
- Promise是一种构造函数。
- Promise实例创建后会立即执行。
二、Promise的基本使用
console.log("1")
new Promise((resolve,reject)=>{ // resolve,reject是形式参数,可以是任意写法,如(res, rej),默认第一个参数实现的是resolve功能;第二个参数实现的是reject功能。
console.log("2")
resolve("成功了")
console.log("3") //resolve()不同于return, resolve()执行完成后后面的代码还会执行。
})
执行结果:
1
2
3
Promise {<fulfilled>: "成功了"} // 一般状态改变后的操作放在then回调函数中
// 所以最好写成
new Promise((resolve,reject)=>{
console.log("2")
return resolve("成功了")
console.log("3") //不再执行,最好不要在状态改变后添加操作
})
//resolve()不同于return, resolve()执行完成后后面的代码还会执行。 创建实例如下: const p = new Promise((resolve,reject)=>{ //需要实现的异步操作
........
........
if("success") resolve(value)
// resolve是js引擎提供定的成功后调用的函数,作用就是手动将该promise的状态由,pending(未完成)变为fulfilled(异步操作成功),然后立即触发then中的成功回调函数
// value值是异步操作的结果,要传给后面的回调函数的值
// 值的内容可以根据业务需求自己定;可以是值(普通对象,函数,字符,数字等)也可以是Promise对象
else reject(new Error)
//reject也是js引擎提供的失败后调用的函数,作用就是手动将状态由pending变为
//ejected(异步操作失败),参数是抛出的异常。然后才能触发then中的错误回调函数或者catch中的回调函数
})
三、Promise的实例方法
1. Promise.prototype.then()
是什么:then方法是Promise构造函数原型对象上的方法。
作用: 为实例状态改变时添加回调函数(相当于实例状态变化的监听函数)。
(1).then方法接受两个回调函数作为参数,
第一个函数是实例状态变为resolved(fulfilled)时的回调函数;
第二个函数是实例状态变为rejected时的回调函数。
p.then(function(value){
// 前面实例中resolve方法执行后触发该方法,即状态为fulfilled(resolved)状态时触发的回调函数
// value值就是resolve的参数值
},function(err) {
// 前面实例中reject方法执行后会触发该方法,即状态为rejected时
})
(2).then方法返回一个新的Promise实例,所以可以采用链式写法;
then方法的第一个回调函数的返回值,即return的值作为下一个then方法里面的函数传参。
如果返回值不是Promise对象,会触发下一个then方法的第一个回调函数, 并且返回值作为回调函数的参数;
2. Promise.prototype.catch()
是什么:Promise原型上的catch方法,相当于.then(null/undefined, () => {}),所以返回的也是promise,后面还可以跟then或者catch,只在rejected状态触发。
作用: 它可以捕获所有之前执行的promise中的错误,最好所有的promise都在最后使用catch方法,不要在then方法中写第二个回调函数
p.then((val) => {
throw new Error("failed");
}).then((val) => {
// TODO
}).catch((err) => {
console.log(err); // Error: failed 捕获内部异常
})
3. Promise.prototype.finally()
作用:不管状态(不能是pending)如何,都会执行的方法。
new Promise((resolve,reject) => {
// 状态修改为resolved或者rejected
}).finally(() => {...} )
finally方法最后返回一个promise实例,回调函数不接受任何值,return方法也被忽略。
但是会默认返回之前的实例对象传递的参数。
应用:
如处理文件完成后,不论成功与否都关闭文件。
四、Promise常用的两个静态方法
1、Promise.all()
接受一个数组(每个参数都是promise实例)作为参数。
如果参数不是promise实例,系统会自动调用Promise.resolve()方法,将参数转为promise实例。
返回一个数组,参数实例的返回值作为对应的回调函数的参数
const arr = [1,2];
Promise.all(arr) // 相当于 arr.map(item => Promise.resolve(item))
.then(data => console.log('data-->',data))
//运行结果如下:
// data--> [1,2]
2、Promise.race()
参数性质和Promise.all()一样,都是以参数为Promise实例的数组为参数。
返回一个新的Promise实例。
作用不一样:
只要有一个参数实例的状态发生改变,新的实例的状态随之改变,参数实例的返回值作为对应的回调函数的参数。
Promise对象,究竟为何物?的更多相关文章
- 谈谈 ES6 的 Promise 对象
https://segmentfault.com/a/1190000002928371 前言 开篇首先设想一个日常开发常常会遇到的需求:在多个接口异步请求数据,然后利用这些数据来进行一系列的操作.一般 ...
- angular学习笔记(二十八-附2)-$http,$resource中的promise对象
下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...
- ES6深入学习记录(二)promise对象相关
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...
- es6中的promise对象
Promise是异步里面的一种解决方案,解决了回调嵌套的问题,es6将其进行了语言标准,同意了用法,提供了`promise`对象, promise对象有三种状态:pending(进行中) .Resol ...
- ES6的promise对象应该这样用
ES6修补了一位Js修真者诸多的遗憾. 曾几何时,我这个小白从js非阻塞特性的坑中爬出来,当我经历了一些回调丑陋的写法和优化的尝试之后,我深深觉得js对于多线程阻塞式的开发语言而言,可能有着其太明显的 ...
- Angularjs promise对象解析
1.先来看一段Demo,看完这个demo你可以思考下如果使用$.ajax如何处理同样的逻辑,使用ng的promise有何优势? var ngApp=angular.module('ngApp',[]) ...
- 由面试引发的思考:B/S与C/S究竟是何物
一.现状说明: 就在这金三银四的求职黄金时期,我有幸作为公司的独立技术面试官,拥有最终决定录用权,在倍受上级领导的充分信任下,我也向上级保证,一定要为公司找到合适的人才,就在我满怀信心的情况下面试了一 ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- Promise对象
1.Promise思想:每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程.这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用. ...
随机推荐
- 2个快速制作完成一幅思维导图的iMindMap思维导图用法
随着思维导图的流行,与其相关的思维导图制作软件如雨后春笋,纷纷进入我们的视野中,更让人难以选择.那想要入门的萌新该如何开始这个新的旅途呢? 各式各样的思维导图制作软件当中,有一个软件得到了大家一致的好 ...
- gitlab 搭建(基于现有nginx)
普通搭建请看:gitlab 搭建 一.gitlab搭建 1.添加GitLab镜像源并安装gitlab服务器 wget https://mirrors.tuna.tsinghua.edu.cn/gitl ...
- Ubuntu16.04配置静态ip
1.安装好ubuntu16.04虚拟机之后,首先按照下图的步骤进行: 首先需要打开虚拟网络编辑器,点击VMnet8的虚拟网卡,如果没有这个网卡,只需在编辑虚拟机设置里面将网络适配器类型改为NAT模式, ...
- 上位机学习技巧——c#(原创)
(一直更新.......) 一.扫描可用串口 二.捕获鼠标移到控件(上升沿)/离开控件(下降沿) 在窗体生成代码中,找到对应按钮(这里使用butten1)区域,在区域内添加两个事件,分别是: 鼠标移到 ...
- MySql学习笔记--详细整理--上
目录 MySql MySql安装 连接数据库 操作数据库 数据库的列类型 数据库的字段属性 创建数据库 修改删除表 数据管理 外键 DML语言 添加 修改 删除 DQL查询数据(重点) 查询 去重 w ...
- Codeforces Round #670 (Div. 2) D. Three Sequences 题解(差分+思维+构造)
题目链接 题目大意 给你一个长为n的数组a,要你构造一个非严格单调上升的数组b和一个非严格单调下降的数组c,使得\(b_i+c_i=a_i\) 要你使这两个数组b,c中最大的元素最小,还有q次修改(q ...
- 我是如何使计算提速>150倍的
我是如何使计算提速>150倍的 我的原始文档:https://www.yuque.com/lart/blog/lwgt38 书接上文<我是如何使计算时间提速25.6倍>. 上篇文章提 ...
- python—数据类型和变量
在python中,能够直接处理的数据类型和变量有整数.浮点数.字符串.布尔值.空值.变量. 一.整数 1.python可处理任意大小的整数,包括负整数,在程序中的表示方法与在数学中的方法一样.例如:0 ...
- Visual Studio 连接 SQL Server 关键代码
首先先把Visual Studio 上面工具打开-->连接数据库-->选择Microsoft SQL Server进入(有两种验证方式:1.windows验证方式[就是本机验证]:2.SQ ...
- UPX使用教程
UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...