技术文摘
JavaScript中从头开始实现Polyfills PromiseallSettled教程
JavaScript 中从头开始实现 Polyfills PromiseallSettled 教程
在 JavaScript 的异步编程领域,Promise.allSettled 是一个非常实用的方法。它允许我们并行处理多个 Promise,无论每个 Promise 的最终状态是成功还是失败,都会返回一个新的 Promise,该 Promise 解决时会包含一个数组,数组中的每个元素对应原始 Promise 的结果。如果想要深入理解 Promise.allSettled 的原理,自己动手实现一个 Polyfill 是个不错的方法。
我们要明确 Promise.allSettled 的基本行为。它接收一个 Promise 数组作为参数,返回一个新的 Promise。当所有输入的 Promise 都已经完成(不管是成功还是失败),返回的 Promise 就会被解决,其解决值是一个数组,数组中的每个元素都是一个对象,对象包含 status(取值为 fulfilled 或 rejected)和 value(成功时的值或失败时的原因)。
下面开始实现 Polyfill。我们定义一个函数 myPromiseAllSettled,它接收一个 promises 数组作为参数:
function myPromiseAllSettled(promises) {
return new Promise((resolve) => {
if (!Array.isArray(promises) || promises.length === 0) {
resolve([]);
return;
}
const results = [];
let completedCount = 0;
promises.forEach((promise, index) => {
Promise.resolve(promise)
.then((value) => {
results[index] = { status: 'fulfilled', value };
completedCount++;
if (completedCount === promises.length) {
resolve(results);
}
})
.catch((reason) => {
results[index] = { status:'rejected', reason };
completedCount++;
if (completedCount === promises.length) {
resolve(results);
}
});
});
});
}
在这段代码中,我们首先检查传入的 promises 是否是数组且不为空。如果不满足条件,直接返回一个空数组的已解决 Promise。接着,我们创建了一个 results 数组来存储每个 Promise 的结果,以及一个 completedCount 变量来记录已经完成的 Promise 数量。
通过 forEach 遍历 promises 数组,对每个 Promise 使用 Promise.resolve 进行处理。如果 Promise 成功,将结果存入 results 数组并更新 completedCount,当所有 Promise 都完成时,调用 resolve 返回结果数组。如果 Promise 失败,同样存入结果并更新计数,直到所有 Promise 都处理完毕后返回结果。
通过这样的实现,我们就完成了 Promise.allSettled 的 Polyfill,更深入地理解了其内部的运行机制,这对于优化异步代码和处理复杂的异步操作场景都非常有帮助。
- MyBatis动态SQL报错badSql 如何修改SQL语句实现正确执行
- MySQL中any_value子查询下WHERE IN失效的原因探讨
- JPA查询同一对象,修改值后再次查询却得到更新后的值的原因
- 如何借助闭包表高效模糊查询树状结构数据
- JPA查询同一对象时修改为何会相互影响
- 怎样高效统计群发消息的用户未读条数
- Spring Boot查询SQL为空时,IDEA返回空结果而Navicat能成功查询的原因
- 怎样查询指定部门及其下属部门的全部用户
- MySQL UPDATE 操作报错 invalid input syntax for integer 怎么解决
- 怎样在关联表中查询符合特定条件的两组数据
- Spring Boot 集成 MyBatis 时怎样灵活选取动态 SQL 参数
- InnoDB非唯一索引重复键的排列方式是怎样的
- MySQL 如何查询重复 refund_id 且关联 return_code 为 'SUCCESS' 的记录
- MySQL 关联表查询:如何筛选两种不同关联关系的数据
- MySQL 中 TEXT 字段以 0 作筛选条件为何会查询出所有数据