网站首页 > 技术文章 正文
结束了忙碌的一天,紧绷的神经还未放松,是不是一想到前端面试题就又开始焦虑?别担心!在这宁静的夜晚,让我们抛开白天的喧嚣,静下心来,用一杯热咖啡的时间,一起拆解一道超经典的 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 的解析,能成为你夜晚学习路上的一盏温暖小灯。觉得有帮助的话,别忘了点赞关注,明天同一时间,我们继续在代码的世界里,寻找更多治愈又实用的知识!
- 上一篇: 宁静清晨!两道 CSS 面试题,助你从容应对职场挑战
- 下一篇: 面试必问!前端自动检测代码更新大揭秘
猜你喜欢
- 2025-05-15 面试必问!前端自动检测代码更新大揭秘
- 2025-05-15 宁静清晨!两道 CSS 面试题,助你从容应对职场挑战
- 2025-05-15 惬意晨光中!2 道 JS 面试题漫谈,开启知识小旅程
- 2025-05-15 前端面试被问「你在未来 5 年的职业目标是什么」
- 2025-05-15 焦虑退散!3 道 JS 面试题详解,轻松吃透核心考点
- 2025-05-15 焦虑求职季!3 大 JS 高频题解析,助你面试稳拿 offer
- 2025-05-15 悠然晨光里!2 道 JS 面试题慢品,开启高效学习日
- 2025-05-15 疲惫下班别愁!1 道 TypeScript 面试题助你充电避坑
- 2025-05-15 懵圈!面试官追问 HTML 空元素细节,3 分钟吃透核心考点
- 2025-05-15 [抓狂瞬间] 5 大差异 + 布局绝招!前端元素面试通关秘籍
你 发表评论:
欢迎- 最近发表
-
- 宇宙厂:深入聊聊 CJS 和 ESM 模块化三点核心差异?
- #前端高手进阶#一起薅羊毛~
- 前端基础进阶(十):深入详解函数的柯里化
- 2025 年 Object 和 Map 如何选择?
- 为何说 postMessage 才是真正的 setTimeout(0)?
- 为什么高手写 JS 总是又快又好?这10个技巧你要知道
- 2025 年 Deno 终于官宣 pnpm 和 Yarn 可使用 JSR?
- 宇宙厂:为什么前端要了解 Interaction to Next Paint (INP)
- Node.js 原生支持 TypeScript?开发者需要了解的一切
- 请务必用 postTask/isInputPending 释放JS主线程!
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)