技术文摘
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,更深入地理解了其内部的运行机制,这对于优化异步代码和处理复杂的异步操作场景都非常有帮助。
- 多个 SCSS 文件怎样合并编译为一个 CSS 文件
- Element-UI Table合并单元格后最后一行高度异常的解决方法
- Nextjs创建玩家标签生成器应用的方法
- 图表超出边框原因何在
- 怎样巧妙保留小数位数
- 相对定位无法上下居中的原因
- CSS实现两个div在父div内居中且重叠的方法
- 浏览器和独立JS文件运行相同代码输出结果不同的原因
- HTML代码中输入元素:textarea是不是唯一的可输入元素
- React与Vite中解决Ant Design CSS类不自动加载问题的方法
- relative定位下元素为何无法上下居中
- initial-scale在Chrome PC端不起作用的原因
- 冒泡排序封装中无concat方法的原因
- 二维数组数据获取出现undefined,初始化问题的解决方法
- 保留小数位数且不影响整数显示的方法