| |
| const PENDING = 'pending', |
| FULFILLED = 'fulfilled', |
| REJECTE = 'reject' |
| function MyPromise(executor) { |
| const self = this |
| |
| self.status = PENDING |
| |
| self.onResolveCb = [] |
| |
| self.onRejectedCb = [] |
| |
| function resolve(value) { |
| |
| if (value instanceof MyPromise) { |
| return value.then(resolve, reject) |
| } |
| |
| if (self.status === PENDING) { |
| self.status = FULFILLED |
| |
| self.value = value |
| |
| self.onResolveCb.forEach((cb) => cb(value)) |
| } |
| } |
| function reject(reason) { |
| |
| if (self.status === PENDING) { |
| self.status = REJECTE |
| |
| self.value = reason |
| |
| self.onRejectedCb.forEach((cb) => cb(reason)) |
| } |
| } |
| try { |
| |
| executor(resolve, reject) |
| } catch (e) { |
| reject(e) |
| } |
| } |
| |
| MyPromise.prototype.then = function (onFulFilled, onRejected) { |
| |
| onFulFilled = typeof onFulFilled === 'function' ? onFulFilled : (value) => value |
| onRejected = |
| typeof onRejected === 'function' |
| ? onRejected |
| : (reason) => { |
| throw new e(reason) |
| } |
| |
| let self = this |
| let promise2 |
| if (self.status === FULFILLED) { |
| console.log('then fulfilled') |
| return (promise2 = new MyPromise((resolve, reject) => { |
| |
| setTimeout(() => { |
| try { |
| let x = onFulFilled(self.value) |
| |
| resolvePromise(promise2, x, resolve, reject) |
| } catch (e) { |
| reject(e) |
| } |
| }) |
| })) |
| } |
| if (self.status === REJECTE) { |
| promise2 = new MyPromise((resolve, reject) => { |
| setTimeout(() => { |
| try { |
| let x = onRejected(self.value) |
| resolvePromise(promise2, x, resolve, reject) |
| } catch (e) { |
| reject(e) |
| } |
| }) |
| }) |
| return promise2 |
| } |
| if (self.status === PENDING) { |
| console.log('then pending') |
| |
| self.onResolveCb.push(() => { |
| return (promise2 = new MyPromise((resolve, reject) => { |
| setTimeout(() => { |
| try { |
| let x = onFulFilled(self.value) |
| resolvePromise(promise2, x, resolve, reject) |
| } catch (e) { |
| reject(e) |
| } |
| }) |
| })) |
| }) |
| |
| self.onRejectedCb.push(() => { |
| return (promise2 = new MyPromise((resolve, reject) => { |
| setTimeout(() => { |
| try { |
| let x = onRejected(self.value) |
| resolvePromise(promise2, x, resolve, reject) |
| } catch (e) { |
| reject(e) |
| } |
| }) |
| })) |
| }) |
| } |
| } |
| |
| function resolvePromise(promise2, x, resolve, reject) { |
| |
| console.log('resolve Promise') |
| let called = false |
| if (promise2 === x) { |
| return reject(new Typee('循环引用')) |
| } |
| if (x instanceof MyPromise) { |
| if (x.status === PENDING) { |
| x.then(function (y) { |
| resolvePromise(promise2, y, resolve, reject) |
| }, reject) |
| } else { |
| x.then(resolve, reject) |
| } |
| |
| } else if (x !== null && (typeof x === 'object' || typeof x === 'function')) { |
| |
| try { |
| console.log('应该执行到这里', typeof x.then === 'function') |
| |
| let then = x.then |
| if (typeof then === 'function') { |
| then.call( |
| function () { |
| console.log('执行到here') |
| |
| if (called) return |
| called = true |
| resolvePromise(promise2, x, resolve, reject) |
| }, |
| function (e) { |
| if (called) return |
| called = true |
| reject(e) |
| } |
| ) |
| } else { |
| |
| resolve(x) |
| } |
| } catch (e) {} |
| |
| } else { |
| if (called) return |
| called = true |
| resolve(x) |
| } |
| } |
| MyPromise.prototype.catch = function (onRejected) { |
| this.then(null, onRejected) |
| } |
| |
| MyPromise.deferred = MyPromise.defer = function () { |
| let defer = {} |
| defer.promise = new MyPromise(function (resolve, reject) { |
| defer.resolve = resolve |
| defer.reject = reject |
| }) |
| return defer |
| } |
| MyPromise.all = function (promises) { |
| return new MyPromise((resolve, reject) => { |
| const result = [] |
| |
| let count = 0 |
| function done(index) { |
| return function (data) { |
| result[index] = data |
| if (++count === promises.length) { |
| resolve(result) |
| } |
| } |
| } |
| promises.forEach((promise, index) => { |
| promise.then(done(index), reject) |
| }) |
| }) |
| } |
| MyPromise.race = function (promises) { |
| return new MyPromise((resolve, reject) => { |
| promises.forEach((promises) => { |
| promises.then(resolve, reject) |
| }) |
| }) |
| } |
| MyPromise.resolve = function (value) { |
| return new MyPromise((resolve) => resolve(value)) |
| } |
| MyPromise.reject = function (reason) { |
| return new MyPromise(resolve, (reject) => reject(reason)) |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const pr1 = new MyPromise((resolve) => { |
| resolve(100) |
| }) |
| const pr2 = pr1.then((data) => { |
| console.log('datapro1', data) |
| |
| return new Promise((resolve) => { |
| resolve(data) |
| }) |
| }) |
| pr2.then((data) => console.log('datapro2', data)) |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?