Promise是什么?
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
从语法上说,Promise 是一个对象(也就是一个容器),里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
为什么需要Promise?
比如我在工作中使用ajax发一个请求A后,成功后拿到数据,我们需要把数据传给请求B,会导致多个请求的嵌套,代码不够直观。
这个时候我们可以选用Promise对象。
基本用法
ES6规定,Promise对象是一个构造函数,用来生成Promise实例。
三种状态
pending(进行中)fulfilled(已成功)rejected(已失败)
特点
- 只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;
- 一旦状态改变,就不会在变。
- 状态改变的过程只可能是:从
pending变为fulfilled和从pending变为rejected。如果状态发生上述变化后,此时状态就不会在改变了,这时就称为resolved(已定型)
如何创建实例
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
resolve()
将Promise对象的状态从pending变为fulfilled,在异步操作成功的时候调用,并将异步操作的结果作为参数传递出去。
reject()
将Promise对象的状态从pending变为rejected,在异步操作的时候调用,并将异步操作报出的错误作为参数传递出去。
then()
可以接收两个回调函数作为参数,分别作为fullFiled状态的回调函数和rejected状态的回调函数。
Promise 中的方法
then()
他的作用上面也有提到,是为Promise实例添加状态改变时的回调函数。
- 第一个参数是fullfiled状态的回调函数。
- 第二个参数(可选)是rejected状态的回调函数。
then 方法返回的是一个新的Promise实例。因此可以采用链式写法,即then方法后面再调用一个then方法;采用链式的then可以指定一组按照次序调用的回调函数,
catch()
发生错误的回调函数。
一般不要再then的方法中定义Rejected状态的回调函数,而应总使用catch方法。
catch方法还是返回一个Promise对象
all()
参数
iterable 必须是一个可迭代对象,如 Array 或 String。
返回值
一个新的
Promise实例。作用
用于将多个
Promise实例包装成一个新的Promise实例。
如果传入的参数中存在不是Promise实例,则会先调用Promise.resolve,将其转为Promise实例,再进一步处理。
var promises=[2,3,4].map(id =>{
return getJSON('/post/'+id+".json");
});
Promise.all(promises).then(posts =>{
//...
}).catch(reason =>{
//...
})
注意点
只有p1,p2,p3的状态都变为
fullfiled,p状态才能变成fullfiled;此时p1,p2,p3的返回值组成一个数组,传递给p的回调函数只要p1,p2,p3有一个被
rejected,p的状态就变为rejected;
race()
参数
iterable 必须是一个可迭代对象,如 Array 或 String。
返回值
一个新的
Promise实例。作用
用于将多个
Promise实例包装成一个新的Promise实例。与all()的不同点
只要p1,p2,p3中有一个实例率先改变状态,p的状态就跟着改变。此时率先改变的Promise实例的返回值就会传递给p的回调函数。
resolve()
返回值
一个新的
Promise实例。作用
将现有对象转化为Promise。
参数(有以下四种情况)
- 参数是Promise实例,不做任何修改。
- 参数是一个thenable对象(指的是具有then方法的对象),会立即执行thenable对象的then方法。
- 参数不是第二种或者根本不是对象,返回一个新的Promise对象,状态为Resolved(fullfiled);
- 不带任何参数,返回一个新的Promise对象,状态为Resolved。
reject()
作用
会返回一个新的Promise对象,状态为Rejected。