Promise用法
一个函数参数:new Promise(function(resolve, reject))
每个Promise构造函数可接受一个参数,参数为一个函数,函数又有两个参数resolve和reject,分别表示为成功之后的回调函数和失败之后的回调函数。
const promise = new Promise ((resolve, rereject) => {
if (/* 异步操作成功 */){
return resolve(value);
} else {
return reject(error);
}
})
promise.then((value) => {
// success
}, (error) => {
// failure
});
ES6将某一件可能发生异步操作的事情, 分成两个阶段: unsettled和settled
- unsettled: 未决阶段, 表示事情还在进行前期的处理, 并没有发生通向结果的那件事
- settled: 已决阶段, 事情已经有了一个结果, 不管这个结果是好是坏, 整件事情无法逆转。
当异步操作执行成功后,会将异步操作结果作为参数传入 resolve 函数并执行,此时 Promise对象状态从 pending 变为 fulfilled ;
失败就会将异步操作的错误作为参数传入 reject 函数并执行,此时 Promise对象状态从pending 变为 rejected
两个状态转换:pending>fulfilled, pending>rejected
从两种状态转换可以看出有三种状态,挂起状态pending,成功状态fulfilled,失败状态rejected。状态改变后就不会再被改变。
三个原型方法:.then(), .catch(), .finally()
- then: 创建一个后续处理函数, 当Promise为resolved状态时运行该函数.
- finally: 创建一个后续处理参数(无参),当Promise为settled时运行该函数。
- catch: 创建一个后续处理函数,当Promise为rejected状态时运行该函数。
const promise = new Promise((resolve, reject) => {
resolve(1);
})
const promise2 = promise.then(res => res * 2);
promise2.then(res => {
console.log(res);
})
const promise = Promise((resolve, reject) => {
resolve();
})
promise.finally(() => {
console.log('helloworld');
})
.finally()方法,无论结局如何都会执行的回调函数。
const proms = [];
for(let i = 0; i < 10; i ++) {
proms.push(new Promise((resolve, reject) => {
setTimeout(() => {
resolve(i);
}, 3000)
}))
}
Promise.all(proms).then(res => {
console.log('全部请求完成',res);
}).catch(err => {
console.log(err);
})
四个普通方法:.all(iterable), .race(iterable), .resolve(value), .reject(value)
- .all()方法iterable参数必须是一个可迭代对象。等所有传入的参数状态由pending>fulfilled时,执行状态为resolve的回调函数.并且then() 方法的第一个函数参数。如果iterable中有一个状态变为rejected状态,会立马执行reject的回调函数。
- .race()方法iterable参数必须是一个可迭代对象。第一个状态由pending>rejected或pending>fulfilled时触发,触发对应的resolve或reject函数,剩下的可迭代项继续执行,但执行结束后不会执行对应状态的回调函数。
- .resolve()方法,用于返回一个状态为成功(fulfilled)状态的Promise对象。
- .rejecct()方法,用于返回一个状态为失败(rejected)状态的Promise对象。