351 字
2 分钟
手写Promise
暂未整理,先附上代码
class _Promise {constructor(excutor) { this.state = "pending";
this.resolveInfo = undefined; this.rejectInfo = undefined;
this.resolveCb = [];
this.rejectCb = [];
const resolve = (value) => { if (this.state === "pending") { this.state = "fullfilled"; this.resolveInfo = value; this.resolveCb.forEach((fn) => { fn(this.resolveInfo); }); } }; const reject = (value) => { if (this.state === "pending") { this.state = "rejected"; this.rejectInfo = value; this.rejectCb.forEach((fn) => { fn(this.rejectInfo); }); } }; try { excutor(resolve, reject); } catch (error) { reject(error); }}then(onFullfilled, onRejected) { const innerPromise = new _Promise((resolve, reject) => { if (this.state === "fullfilled") { setTimeout(() => { try { const returnValue = typeof onFullfilled === "function" ? onFullfilled(this.resolveInfo) : (value) => value; _Promise.resolvePromise.apply( innerPromise, returnValue, resolve, reject ); } catch (error) { reject(error); } }, 0); } if (this.state === "rejected") { setTimeout(() => { try { const returnValue = typeof onRejected === "function" ? onRejected(this.rejectInfo) : (value) => value; _Promise.resolvePromise.apply( innerPromise, returnValue, resolve, reject ); } catch (error) { reject(error); } }, 0); } if (this.state === "pending") { this.resolveCb.push(() => { setTimeout(() => { try { const returnValue = typeof onFullfilled === "function" ? onFullfilled(this.resolveInfo) : (value) => value; _Promise.resolvePromise.apply( innerPromise, returnValue, resolve, reject ); } catch (error) { reject(error); } }, 0); }); this.rejectCb.push(() => { setTimeout(() => { try { const returnValue = typeof onRejected === "function" ? onRejected(this.rejectInfo) : (value) => value; _Promise.resolvePromise.apply( innerPromise, returnValue, resolve, reject ); } catch (error) { reject(error); } }, 0); }); } }); return innerPromise;}
static resolvePromise(newPromise, returnValue, resolve, reject) { if (newPromise === returnValue) { return reject(new Error("不能重复引用")); } // 防止多次调用 let called;
if ( returnValue instanceof _Promise && typeof returnValue.then === "function" ) { returnValue.then( (innerResolveMsg) => { if (called) return; called = true; resolvePromise(newPromise, innerResolveMsg, resolve, reject); }, (innerRejectedMsg) => { if (called) return; called = true; resolvePromise(newPromise, innerRejectedMsg, resolve, reject); } ); } else { resolve(returnValue); }}}目前只实现了then方法,后续还有resolve,reject,catch, all, race, finally