专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

疲惫夜晚充电!1 道 JS 异步手写题攻克面试关键考点

ins518 2025-05-15 18:20:28 技术文章 2 ℃ 0 评论

结束了忙碌的一天,紧绷的神经还未放松,是不是一想到前端面试题就又开始焦虑?别担心!在这宁静的夜晚,让我们抛开白天的喧嚣,静下心来,用一杯热咖啡的时间,一起拆解一道超经典的 JavaScript 异步高频面试题 ——手写 Promise.allSettled,在代码的世界里找寻属于我们的平静与力量。

一、为什么 Promise.allSettled 会成为面试热门?

在前端开发中,异步操作就像生活里的等待快递,充满了不确定性。Promise.allSettled 能帮我们收集所有 Promise 的最终状态,无论成功还是失败,都能给我们一个完整的反馈。理解它的原理,不仅能轻松应对面试,在实际项目处理多个并行请求时,更是大有用处。想象一下,当你游刃有余地向面试官解释它的实现逻辑时,那种成就感,足以驱散一整天的疲惫。

二、一步步拆解 Promise.allSettled 的实现

先回顾下 Promise.allSettled 的用法:它接收一个 Promise 数组,等所有 Promise 都 “有结果” 后,返回一个新的 Promise,这个 Promise 的结果是一个数组,数组里每个元素记录对应 Promise 的状态(fulfilled 或 rejected)和值。实现它的关键在于:追踪每个 Promise 状态记录最终结果统一返回新 Promise

// 手写Promise.allSettled函数,收集所有Promise的最终状态
function myPromiseAllSettled(promises) {
// 检查传入的是否为可迭代的数组
if (!Array.isArray(promises)) {
return Promise.reject(new TypeError('参数必须是数组'));
}
const result = []; // 用于存储每个Promise的结果
let count = 0; // 记录已完成的Promise数量
return new Promise((resolve) => {
promises.forEach((promise, index) => {
// 将每个元素转为Promise,处理非Promise值
Promise.resolve(promise).then(
value => {
result[index] = {
status: 'fulfilled',
value
}; // 记录成功状态和值
count++;
checkComplete();
},
reason => {
result[index] = {
status:'rejected',
reason
}; // 记录失败状态和原因
count++;
checkComplete();
}
);
});
function checkComplete() {
// 当所有Promise都有结果时,resolve最终结果数组
if (count === promises.length) {
resolve(result);
}
}
});
}

每一行代码都像是在耐心记录生活中的点点滴滴,不管是成功的喜悦,还是失败的遗憾,最终都汇聚成完整的故事。这样的实现思路,是不是让复杂的异步操作也变得温暖又清晰?

三、面试官追问?轻松应对有妙招

问题 1:Promise.allSettled 和 Promise.all 有什么区别?

白话回答:Promise.all 就像约朋友聚会,只要有一个朋友来不了(Promise 失败),整个聚会就取消(直接 reject);而 Promise.allSettled 更像统计朋友们的行程,不管最后来没来(成功或失败),都会告诉你每个人的情况,给你一个完整的反馈。

问题 2:为什么要先把传入的元素转为 Promise?

白话回答:因为传入的数组里可能有普通值,也可能是 Promise。把它们都转为 Promise,就像给所有人统一发了一张 “参与券”,这样就能用同样的方式处理,保证结果的一致性。

问题 3:如何优化 myPromiseAllSettled 的性能?

白话回答:可以用 Promise.race 加定时器来设置超时时间,避免某个 Promise 一直 pending 卡住。还能通过并发控制,限制同时执行的 Promise 数量,就像控制餐厅同时接待的客人,防止资源过度消耗。

四、在代码中寻找治愈的力量

其实写代码就像写日记,每一行都是对技术世界的探索与感悟。这些面试题也并非是冰冷的考验,而是帮助我们更好地理解代码运行的逻辑,在未来的开发道路上走得更稳。当你在夜晚攻克一道难题时,那种内心的平静与满足,足以治愈白天的疲惫。

异步操作中,Promise 还是 async/await 更好用?

有人觉得 Promise 链式调用灵活自由,能清晰展现异步流程;也有人偏爱 async/await,认为它让异步代码看起来像同步代码,更符合直觉。宝子们,你们在项目中更常用哪种方式?快来评论区分享你的观点,一起在技术的交流中碰撞出更多火花!

今晚的分享就到这里啦~希望这道 Promise.allSettled 的解析,能成为你夜晚学习路上的一盏温暖小灯。觉得有帮助的话,别忘了点赞关注,明天同一时间,我们继续在代码的世界里,寻找更多治愈又实用的知识!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表