一、promise基础部分实现
// 核心:3个状态2个方法1执行器// 扩展:2个异步回调容器const PENDING = 'PENDING'const RESOLVED = 'RESOLVED'const REJECTED = 'REJECTED'class Promise { // 规范 promise 可以是函数或对象 constructor(executor) { // part1 this.status = 'PENDING' this.value = undefined // 规范 值类型:undefined thenable promise this.reason = undefined // part2 this.onResolvedCallbacks = [] this.onRejectedCallbacks = [] let resolve = (value) => { if (this.status === PENDING) { this.value = value this.status = RESOLVED // part2 // 异步执行完成后(例如settimeout) 发布执行 this.onResolvedCallbacks.forEach(fn => fn()) } } let reject = (reason) => { if (this.status === PENDING) { this.reason = reason this.status = REJECTED // part2 // 异步执行完成后(例如settimeout) 发布执行 this.onRejectedCallbacks.forEach(fn => fn()) } } try { executor(resolve, reject) } catch (error) { reject(error) } } // 每个promise 上都有then方法并可以then多个 按顺序执行 // 能读到实例上成功值 value 和 失败值 reason // 能执行成功方法 onfulfilled 和 失败方法 onrejected then(onfulfilled, onrejected) { // then目前有2个参数 // part1 解决同步 if (this.status === RESOLVED) { onfulfilled(this.value) } if (this.status === REJECTED) { onrejected(this.reason) } // part2 解决异步 // 多个then的时候处理 if (this.status === PENDING) { // 如果是异步就先订阅好 this.onResolvedCallbacks.push(() => { // todo... onfulfilled(this.value) }) // 重写push方法的时候加入自己逻辑todo this.onRejectedCallbacks.push(() => { // todo... onrejected(this.reason) }) // 重写push方法的时候加入自己逻辑todo } } catch() { }}module.exports = Promise
// 测试用例
let Promise = require('./Promise')let promise = new Promise((res, rej) => { //场景1 错误执行 // throw new Error('失败') //场景2 异步执行 执行器 setTimeout(() => { res('成功的数据') }, 1000) // setTimeout(() => { // rej('失败的数据') // }, 1000)})promise.then(data => { // 成功 console.log('data', data)}, err => { // 失败 console.log('err', err)})promise.then(data => { // 成功 console.log('data1', data)}, err => { // 失败 console.log('err', err)})promise.then(data => { // 成功 console.log('data2', data)}, err => { // 失败 console.log('err', err)})