date
type
status
slug
summary
tags
category
password
icon
在现代 JavaScript 中,Promise 是一种用于处理异步操作的重要工具。通过手写实现一个简单的 Promise 类,我们能更深入地理解 Promise 的工作原理和异步编程的机制。在这篇博客中,我们将逐步构建一个功能齐全的 Promise 类,包括基本结构、then 方法、静态方法如 resolverejectallallSettledraceany,以及一些辅助方法。

Promise 的基本结构

首先,我们定义一个 MyPromise 类,其中包含常见的 Promise 状态和基本结构:
 
这里定义了 MyPromise 类的基本结构,包括状态常量、初始值、状态和执行回调数组等。

实现 then 方法

then 方法是 Promise 的核心,它用于注册在 Promise 完成时执行的回调函数。以下是 then 方法的基本实现:
 
then 方法中,我们判断当前 Promise 的状态,根据状态的不同执行相应的回调函数。如果是异步状态,则将回调函数推入对应的回调数组中,等待状态改变时执行。

实现 resolvereject 静态方法

resolverejectMyPromise 类的两个静态方法,用于创建已解决或已拒绝的 Promise。以下是它们的实现:
 
这两个方法分别返回一个已解决或已拒绝的 Promise。

实现 all 方法

all 方法接收一个 Promise 数组,返回一个新的 Promise。只有当所有输入的 Promise 都解决时,新 Promise 才会解决,并返回包含所有 Promise 结果的数组;否则,只要有一个 Promise 拒绝,新 Promise 就会被拒绝。
 

实现 allSettledraceany 方法

allSettled 方法返回一个 Promise,该 Promise 在所有给定的 Promise 都已经解决或拒绝后解决。它会等待所有的 Promise 完成,无论成功还是失败,并返回一个包含每个 Promise 结果的数组。
 
race 方法返回一个 Promise,该 Promise 在给定的任意 Promise 解决或拒绝后立即解决。
 
any 方法返回一个 Promise,该 Promise 在给定的任意 Promise 解决后立即解决。与 race 不同的是,any 只要有一个 Promise 解决即可,不管其状态是成功还是失败。
 

辅助方法:deferred

为了方便创建一个延迟解决的 Promise 对象,我们添加了 deferred 方法:
 
这个方法返回一个包含 promiseresolvereject 的对象,方便后续使用。

总结

通过以上的实现,我们成功地创建了一个简单但功能齐全的 Promise 类。这个手写 Promise 不仅具备基本的异步操作能力,还支持 Promise 链式调用和常见的 Promise 方法,如 thenresolverejectallallSettledraceany
手写实现 Promise 是一个有挑战性但也有益处的练习,有助于更深入地理解 Promise 的工作原理和异步编程的机制。希望这篇博客对你理解 Promise 有所帮助。
 
手写防抖节流与深拷贝独立开发,做的页面不好看?我总结了一些工具与方法
Loading...