前言
今天有点闲,今天一个前同事去面试,完了问我Promise我知道怎么用,但是面试官问我怎么自己封装?一脸懵逼...立马带她学习一波,顺便自己复习一下!!!
Promise的简介
Promise是一种解决异步操作的方案,在一段时间内给你一个结果,根据不同的结果,对应不同的承诺结果。Promise有三种状态:pending(等待)、fulfiled(成功)、rejected(失败),状态一旦改变,就不能再变,也就是说Promise是不可逆的,是不是像极了一个实诚的老实人。 Promise使用场景:
- 解决回调地狱问题,为了让代码更好的维护。
- 解决异步问题,不能说Promise是一步的,而是给异步操作提供了解决方案。
- 同时处理多个异步操作,大部分的场景是同时发生多个请求,获取数据。 相信大家都会怎么用Promise,那我们来探究一下简单的封装...
手写Promise
class myPromise {
constructor(fn) {
this.resolvedCallbacks = [];
this.rejectedCallbacks = [];
this.status = 'PENDING';
this.value = '';
fn(this.resolve.bind(this), this.reject.bind())
}
resolve(val) {
if (this.status === 'PENDING') {
this.status = 'RESOLVED';
this.value = val;
this.resolvedCallbacks.map(cb => cb(val))
}
}
reject(val) {
if (this.status === 'PENDING') {
this.status = 'REJECTED';
this.value = val;
this.rejectedCallbacks.map(cb => cb(val))
}
}
then(onFulfilled, onRejected) {
if (this.state === 'PENDING') {
this.resolvedCallbacks.push(onFulfilled);
this.rejectedCallbacks.push(onRejected);
}
if (this.state === 'RESOLVED') onFulfilled(this.value);
if (this.state === 'REJECTED') onRejected(this.value);
}
}
let demo = function() {
return new myPromise((resolve, reject) => {
setTimeout(() => {
let count = Math.floor(Math.random() * 100);
if (count % 2 === 0) {
resolve('成功');
} else {
reject('失败');
}
}, 1000)
})
}
demo().then(value => {
console.log('成功 === ', value);
}, err => {
console.log('失败 ===', err)
})