Promise
promise是es6新增的一个对象,promise 对象代表了未来将要发生的事件,用来传递异步操作的消息。
这次我们来实现一个简易版的promise的功能;
// Promise有三种状态,分别对应不同的事件状态,初始状态是pending,一但状态发生了改变就不会再变化,fulfilled代表了成功的状态,rejected代表了失败的状态
const PENDING = 'pendding';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';
class Promise_ {
// 成功的回调、失败回调、成功返回的数据、失败返回的数据
resolveCallback = null
rejectCallback = null
value = null
reason = null
constructor(executor) {
this.state = PENDING
// 声明的时候需要传入一个函数来初始化
executor(this.resolve, this.reject)
}
resolve = value => {
// 只判断这一种状态,且改变状态
if (this.state === PENDING) {
this.state = FULFILLED;
this.value = value;
// 执行成功的回调
this.resolveCallback && this.resolveCallback(value)
}
}
reject = reason => {
// 同上
if (this.state === PENDING) {
this.state = REJECTED;
this.reason = reason;
this.rejectCallback && this.rejectCallback(value)
}
}
then(onSuccess, onError) {
switch(this.state) {
case FULFILLED:
onSuccess && onSuccess(this.value);
break
case REJECTED:
onError && onError(this.reason);
break;
default:
this.resolveCallback = onSuccess;
this.rejectCallback = onError;
}
// 考虑到一般都有链式的调用,这里我们不妨把promise_给return出去
return this
}
// 如果需要catch的话
catch(onError) {
switch(this.state) {
case REJECTED:
onError && onError(this.reason);
break;
case PENDING:
this.rejectCallback = onError;
}
return this
}
}
此时的业务逻辑是 声明一个promise 传入一个异步函数 然后执行then回调 等待异步执行完成后调用resolve/reject。
把代码复制到控制台测试一下 success!!
以上只是实现了一个非常非常简单的promise的一个基本的功能,进阶的话还需要再研究研究!