介绍Promise
是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大. 他的状态是不可逆的,一旦成功或失败之后状态再无法更改.
1、Promise的声明
首先呢,promise肯定是一个类,我们就用class来声明
class Promise{
// 构造器
constructor(executor){
// 成功
let resolve = () => { };
// 失败
let reject = () => { };
// 立即执行
executor(resolve, reject);
}
}
- 由于
new Promise((resolve, reject)=>{}),所以传入一个参数(函数),promise规范里叫他executor,传入就执行。 - executor里面有两个参数,一个叫resolve(成功),一个叫reject(失败)。
- 由于resolve和reject可执行,所以都是函数,我们用let声明。
2、解决基本状态
Promise有规定:
- Promise存在三个状态(state)pending、fulfilled、rejected
- pending(等待态)为初始态,并可以转化为fulfilled(成功态)和rejected(失败态)
- 成功时,不可转为其他状态,且必须有一个不可改变的值(value)
- 失败时,不可转为其他状态,且必须有一个不可改变的原因(reason)
new Promise((resolve, reject)=>{resolve(value)})resolve为成功,接收参数value,状态改变为fulfilled,不可再次改变。new Promise((resolve, reject)=>{reject(reason)})reject为失败,接收参数reason,状态改变为rejected,不可再次改变。- 若是executor函数报错 直接执行reject();
class Promise{
constructor(executor){
// 初始化state为等待态
this.state = 'pending';
// 成功的值
this.value = undefined;
// 失败的原因
this.reason = undefined;
let resolve = value => {
// state改变,resolve调用就会失败
if (this.state === 'pending') {
// resolve调用后,state转化为成功态
this.state = 'fulfilled';
// 储存成功的值
this.value = value;
}
};
let reject = reason => {
// state改变,reject调用就会失败
if (this.state === 'pending') {
// reject调用后,state转化为失败态
this.state = 'rejected';
// 储存失败的原因
this.reason = reason;
}
};
// 如果executor执行报错,直接执行reject
try{
executor(resolve, reject);
} catch (err) {
reject(err);
}
}
}
3、then方法
Promise有一个叫做then的方法,里面有两个参数:onFulfilled,onRejected, 成功有成功的值,失败有失败的值
class Promise{
constructor(executor){...}
// then 方法 有两个参数onFulfilled onRejected
then(onFulfilled,onRejected) {
// 状态为fulfilled,执行onFulfilled,传入成功的值
if (this.state === 'fulfilled') {
onFulfilled(this.value);
};
// 状态为rejected,执行onRejected,传入失败的原因
if (this.state === 'rejected') {
onRejected(this.reason);
};
}
}