关闭页面特效

手动实现promise核心

了解Promise

Promise 构造函数是 JavaScript 中用于创建 Promise 对象的内置构造函数。

Promise 构造函数接受一个函数作为参数,该函数是同步的并且会被立即执行,所以我们称之为起始函数。起始函数包含两个参数 resolve 和 reject,分别表示 Promise 成功和失败的状态。

起始函数执行成功时,它应该调用 resolve 函数并传递成功的结果。当起始函数执行失败时,它应该调用 reject 函数并传递失败的原因。

Promise 构造函数返回一个 Promise 对象,该对象具有以下几个方法:

  • then:用于处理 Promise 成功状态的回调函数。
  • catch:用于处理 Promise 失败状态的回调函数。
  • finally:无论 Promise 是成功还是失败,都会执行的回调函数。

实现一个能把函数放入微队列执行的函数

  • 可以利用MutationObserver的特性把函数放入微队列中执行
  • MutationObserver是一个观察器,使用的时候需要传入一个函数,当它观察到元素发生变化时会把传入的函数放入微队列中执行
// 实现把函数放入微队列执行 function runMicroTask(fn) { // 检测当前环境是node环境还是浏览器环境 // none环境中有process对象,process.nextTick可以直接把函数放入微队列中执行 if (typeof process !== 'undefined' && typeof process.nextTick === 'function') { return process.nextTick(fn) } else if (typeof MutationObserver === 'function') { const ob = new MutationObserver(fn) const textNode = document.createTextNode('1') ob.observe(textNode, { characterData: true }) textNode.data = 2 } }

完整实现代码

function runMicroTask(fn) { if (typeof process !== 'undefined' && typeof process.nextTick === 'function') { return process.nextTick(fn) } else if (typeof MutationObserver === 'function') { const ob = new MutationObserver(fn) const textNode = document.createTextNode('1') ob.observe(textNode, { characterData: true }) textNode.data = 2 } } // 检测一个对象是否为promise对象 function isPromiseLike(obj) { return !!(obj && typeof obj === 'object' && typeof obj.then === 'function') } const PENDING = 'pending' const FULFILLED = 'fulfilled' const REJECTED = 'rejected' class MyPromise { /** * * @param {Function} executor 任务执行器,立即执行 */ constructor(executor) { this._state = PENDING this._value = void 0 this._handlers = [] try { executor(this._resolve.bind(this), this._reject.bind(this)) } catch (error) { this._reject(error) } } _resolve(data) { this._changeState(FULFILLED, data) } _reject(reason) { this._changeState(REJECTED, reason) } _changeState(newState, data) { if (this._state !== PENDING) return this._state = newState this._value = data this._runHandlers() } /** * * @param {Function} executor 处理函数 * @param {String} state 执行处理函数的状态 * @param {Function} resolve * @param {Function} reject */ _pushHandlers(executor, state, resolve, reject) { this._handlers.push({ executor, state, resolve, reject }) } _runHandlers() { if (this._state === PENDING) return while (this._handlers[0]) { const handle = this._handlers[0] this._runOneHandler(handle) this._handlers.shift() } } /** * * @param {Object} handle */ _runOneHandler({ executor, state, resolve, reject }) { runMicroTask(() => { if (this._state !== state) return if (typeof executor !== 'function') { this._state === FULFILLED ? resolve(this._value) : reject(this._value) return } try { const result = executor(this._value) if (isPromiseLike(result)) { result.then(resolve, reject) } resolve(result) } catch (error) { reject(error) } }) } /** * * @param {Function} onFulfilled * @param {Function} onRejected */ then(onFulfilled, onRejected) { return new MyPromise((resolve, reject) => { this._pushHandlers(onFulfilled, FULFILLED, resolve, reject) this._pushHandlers(onRejected, REJECTED, resolve, reject) }) } }

__EOF__

作  者智勇_y
出  处https://www.cnblogs.com/blender-su/p/17760657.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   智勇_y  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
0
0
关注
跳至底部
点击右上角即可分享
微信分享提示