什么是Promise:Promise是JS异步编程的一种解决方案,比传统的解决方案【回调函数】【事件】更合理更强大。传统的解决方案有个问题就是回调地狱,Promise能够让咱们经过l链式调用的方法解决回调地狱的问题。
Promise的状态:
- Pending(进行中):起始状态
- Fulfilled(已成功):resolve函数将promise对象从Pending从pending变成 Fulfilled
- Rejected(已失败):reject函数将promise对象从Pending从pending变成 Failed
只可能从pending->Fulfilled 或者 Pending -> Rejected。只要这两种情发生,状态就凝固了,不会再改变
基本用法
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操做成功 */){
resolve(value);
} else {
reject(error);
}//resolve和reject的参数将会传给回调函数then和catch中
});复制代码
Promise实例生成之后,能够用then方法分别指定resolved状态和rejected状态的回调函数
promise.then(function(value) { // then有两个参数,第一个参数是resovled时的状态回调
// success
}, function(error) { //第二个参数是可选的,为rejected时的状态回调函数
// failure
});
复制代码
Promise 新建后就会当即执行。
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// resolved
复制代码
注意,调用resolve或reject并不会终结 Promise 的参数函数的执行。
new Promise((resolve, reject) => {
resolve(1);
console.log(2);
}).then(r => {
console.log(r);
});
// 2
// 1
const p1 = new Promise(function (resolve, reject) {
// ...
});
const p2 = new Promise(function (resolve, reject) {
// ...
resolve(p1);
})复制代码
上面代码中,p1和p2都是 Promise 的实例,可是p2的resolve方法将p1做为参数,即一个异步操做的结果是返回另外一个异步操做。
注意,这时p1的状态就会传递给p2,也就是说,p1的状态决定了p2的状态。
Promise.Prototype.then:
Prommise状态改变时的回调函数,共有两个参数。第一个参数是Resolve时的回调函数,第二个参数是Rejected时的回调函数(可选参数)
能够使用then方法来进行链式的调用,then的每一次结果都返还给下一个then方法,而后在下一个then方法中对这个值进行处理。每个then方法中均可以再次新建立一个Promise对象,而后返还给下一个then方法处理。
p1.then(() => {
return 1;
}).then((result) => {
console.log(result);
return 'hello'
}).then((result) => {
console.log(result);
});
Promise.Prototype.catch()复制代码
p.then(null,rejection)的别名,用于指定发送错误时的回调函数
Promise对象的错误具备冒泡性值,会一直向后传递,直到被捕获为止。
Promise.all()
用于将多个Promise实例包装成一个新的Promise实例
var p=Promise.all([p1,p2,p3])复制代码
- 接受一个数组做为参数,数组成员都是promise对象的实例,若是不是则经过Promise.resolve方法把参数转为Promise实例
- p的状态由p1,p2,p3决定。p1,p2,p3都为fulfilled p的状态才会变成fulfilled。若其中一个为rejected,则p的状态rejected。
- p1,p2,p3的返回值会组成一个数组,传递给p的回调函数。
- 若p1,p2,p3自身有catch方法,那么他们rejected时不会触发Promise.all()的catch方法
Promise.race()
var p=Promise.race([p1,p2,p3])复制代码
也是将多个Promise实例包装成要给新的Promise实例,只要p1,p2,p3中有一个实例率先改变状态,p的状态就跟着改变。
Promise.resolve()
将现有对象转成Promise对象,状态为resolved
Promise.resolve('foo')
//等价于
new Promise(resolve=>resolve('foo'))复制代码
Promise.reject()
返回一个新的Promise实例,状态为Rejected
var p=Promise.rejected("出错了")
//等价于
var p=new Promise( (resolve,reject) => reject("出错了") ) 复制代码