手写异步的Promise,版本一是一个同步的Promise、用setTimeout模拟异步请求、
promise.js文件
// 手写异步的promise,版本一是一个同步的promise、
const Promise = require('./2-promise.js')
const p = new Promise((resolve, reject) => {
console.log('默认执行');
setTimeout(() => {
reject('失败了')
}, 1000)
// resolve('成功了')
})
p.then((value) => {
console.log('success', value);
}, (reason) => {
console.log('fail', reason);
})
2-promise.js文件代码
思路:1s之后then中代码已经执行过了,我们可以先把then中的回调函数(成功的函数、失败的函数)保存起来,等到1s之后执行resolve或者reject函数时候在把保存的回调函数对应依次执行就好。
const STATUS = {
PENDING: 'PENDING',
FULFILLED: 'FULFILLED',
REJECTED: 'REJECTED'
}
class Promise {
constructor(executor) { // constructor是类的构造函数
this.status = STATUS.PENDING;
this.value = null;
this.reason = null;
this.onResolvedCallbacks = []; // 存放成功的回调的(重点)
this.onRejectedCallbacks = []; // 存放失败的回调的(重点)
const resolve = (value) => {
if (this.status === STATUS.PENDING) {
this.status = STATUS.FULFILLED;
this.value = value;
this.onResolvedCallbacks.forEach(fn => fn()) // 发布
}
}
const reject = (reason) => {
if (this.status === STATUS.PENDING) {
this.status = STATUS.REJECTED;
this.reason = reason;
this.onRejectedCallbacks.forEach(fn => fn()) // 发布
}
}
try {
executor(resolve, reject)
} catch(error) {
reject(error)
}
}
then(onFulfilled, onRejected) {
if (this.status === STATUS.FULFILLED) {
onFulfilled(this.value)
}
if (this.status === STATUS.REJECTED) {
onRejected(this.reason)
}
if (this.status === STATUS.PENDING) {
this.onResolvedCallbacks.push(() => {
onFulfilled(this.value)
})
this.onRejectedCallbacks.push(() => {
onRejected(this.reason)
})
}
}
}
module.exports = Promise;