promise
class KPromise { constructor(handle) { this['[[PromiseState]]'] = 'pending'; this['[[PromiseResult]]'] = undefined; this.resolveQueue = []; this.rejectQueue = []; handle(this.#resolve.bind(this), this.#reject.bind(this)); } #resolve(val) { this['[[PromiseState]]'] = 'fulfilled'; this['[[PromiseResult]]'] = val; const run = () => { // this.resolveFn(val); let cb; while (cb = this.resolveQueue.shift()) { cb && cb(val); } } // setTimeout(run); let ob = new MutationObserver(run); ob.observe(document.body, { attributes: true }) document.body.setAttribute("kkb", "value"); } #reject(err) { this['[[PromiseState]]'] = 'rejected'; this['[[PromiseResult]]'] = err; // this.rejectFn(err); const run = () => { // this.rejectFn(err); let cb; while (cb = this.rejectQueue.shift()) { cb && cb(err); } } // setTimeout(run); let ob = new MutationObserver(run); ob.observe(document.body, { attributes: true }) document.body.setAttribute("kkb", "value"); } then(onResolved, onRejected) { // if(this['[[PromiseState]]']==='fulfilled'){ // onResolved(this['[[PromiseResult]]']) // } // 保存 onResolved、onRejected; // this.resolveFn = onResolved; // this.rejectFn = onRejected; return new KPromise((reslove, reject) => { // onResolved(); let resolveFn = (val) => { let res = onResolved && onResolved(val); if(res instanceof KPromise){ // 返还的一个promise对象,取出值 // res.then(result=>{ // reslove(result); // }) res.then(reslove); }else{ // 普通值 reslove(res); } } this.resolveQueue.push(resolveFn); // this.rejectQueue.push(onRejected); let rejectFn = (err) => { onRejected && onRejected(err); reject(err); } this.rejectQueue.push(rejectFn); }) } static resolve(val){ return new KPromise(resolve=>{ resolve(val); }) } static reject(err){ return new KPromise((resolve,reject)=>{ reject(err); }) } static race(lists){ return new KPromise((resolve,reject)=>{ lists.forEach(item=>{ item.then(res=>{ resolve(res); },err=>{ reject(err); }) }) }) } static allSettled(lists){ let resArr = new Array(lists.length); let num = 0 return new KPromise(resolve=>{ lists.forEach((item,key)=>{ let obj = {}; item.then(res=>{ obj['status'] = "fulfilled"; obj['value'] = res; resArr[key] = obj; num++; if(num>=lists.length){ resolve(resArr); } },err=>{ obj['status'] = "rejected"; obj['reason'] = err; resArr[key] = obj; num++; if(num>=lists.length){ resolve(resArr); } }) }) }) } static all(lists){ let resArr = []; let num = 0; return new KPromise(resolve=>{ lists.forEach(item=>{ item.then(res=>{ num++; resArr.push(res); if(resArr.length===lists.length){ resolve(resArr); } }) }) }) } catch(cb){ this.then(undefined,cb); } finally(cb){ // cb && cb(); this.then(cb,cb); } }
const PENDING = 'pending'; const FULFILLED = 'fulfilled' const REJECTED = 'rejected' class MyPromise { constructor(executor) { try { executor(this.resolve, this.reject) } catch (e) { this.reject(e) } } status = PENDING //初始状态 value = undefined reason = undefined //successcallback 延迟成功回调 successCallback = [] //failcallback 延迟失败回调 failCallback = [] resolve = value => { if (this.status != PENDING) return this.status = FULFILLED this.value = value while (this.successCallback.length) this.successCallback.shift()() } reject = reason => { if (this.status != PENDING) return; this.status = REJECTED this.reason = reason while (this.failCallback.length) this.failCallback.shift()() } then(successCallback, failCallback) { successCallback = successCallback ? successCallback : value => value failCallback = failCallback ? failCallback : reason => reason let promise2 = new MyPromise((resolve, reject) => { if (this.status === FULFILLED) { setTimeout(() => { try { let value = successCallback(this.value) //判断value是普通值还是promise对象 resolvePromise(promise2, value, resolve, reject) } catch (e) { console.log('123') reject(e) } }, 0) } else if (this.status === REJECTED) { setTimeout(() => { try { let value = failCallback(this.reason) //判断value是普通值还是promise对象 resolvePromise(promise2, value, resolve, reject) } catch (e) { reject(e) } }, 0) } else { //wait this.successCallback.push(() => { setTimeout(() => { try { let value = successCallback(this.value) //判断value是普通值还是promise对象 resolvePromise(promise2, value, resolve, reject) } catch (e) { reject(e) } }, 0) }) this.failCallback.push(() => { setTimeout(() => { try { let value = failCallback(this.reason) //判断value是普通值还是promise对象 resolvePromise(promise2, value, resolve, reject) } catch (e) { reject(e) } }, 0) }) } }) return promise2; } static all(array) { let result = [] let index = 0 return new MyPromise((resolve, reject) => { function addDate(key, value) { result[key] = value index++; if (index === array.length) { resolve(result) } // console.log(index) } for (let i = 0; i < array.length; i++) { let current = array[i] if (current instanceof MyPromise) { // promise对象 current.then(value => addDate(i, value), reason => { reject(reason) }) } else { //普通值 addDate(i, array[i]) } } }) } static resolve(value) { if (value instanceof MyPromise) { return value } else { return new MyPromise(resolve => { resolve(value) }) } } finally(callback) { return this.then(value => { return MyPromise.resolve(callback()).then(() => value) }, reason => { return MyPromise.resolve(callback()).then(() => { throw reason }) }) } catch(failCallback) { console.log(123) return this.then(undefined, failCallback) } } function resolvePromise(promise, value, resolve, reject) { if (promise == value) { return reject(new TypeError('error')) } if (value instanceof MyPromise) { //对象 // value.then(value => { // resolve(value) // }, reason => { // reject(reason) // }) value.then(resolve, reject) } else { //普通值 resolve(value) } } module.exports = MyPromise
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~