面试官必问!关于promise的10个高频面试题

481 阅读4分钟

大家好,我是前端理想哥。

如果你正在准备前端开发的面试,那么今天这个话题一定会对你很有帮助。

今天,我们来聊一聊关于promise,面试官可能会问的10个高频面试题?让我们一起来看!

1. Promise的三种状态是什么?

考察点

  • 你是否理解Promise的三种状态,以及它们在异步操作中的作用。

回答提示
Promise有三种状态:

  • Pending(待定) :初始状态,表示Promise尚未完成。
  • Fulfilled(已兑现) :表示操作成功完成,并返回了结果。这里要注意,很多人都说错成 Resolve
  • Rejected(已拒绝) :表示操作失败,并返回了错误信息。

2. 如何实现一个简单的Promise?

考察点

  • 你是否理解如何通过代码实现一个自定义的Promise。
  • 你是否能处理异步操作的结果,正确使用 resolvereject

回答提示: 大家需要可以手写实现promise

3. Promise.racePromise.all 的区别是什么?

考察点

  • 面试官想测试你是否知道这两个方法的差异,什么时候使用 Promise.race

回答提示

  • Promise.all:当所有 Promise 都成功时返回成功结果,否则返回第一个失败的 Promise 错误。
  • Promise.race:返回第一个完成的 Promise(无论是成功还是失败),因此它会更快终止,适用于只关心第一个完成的任务的场景。

4. 什么是Promise.all,它如何工作?它的原理是什么?

考察点

  • 你是否能了解Promise.all的原理,最好可以手写实现。

回答提示Promise.all() 用来并行执行多个异步操作,并且返回一个新的 Promise。当所有传入的 Promise 都成功时,Promise.all 返回的 Promise 也会成功,并返回所有 Promise 的结果;如果其中一个 Promise 失败,Promise.all 返回的 Promise 会立即失败,并返回失败的原因。

5. 实现一个基于 Promise 的并行限制器,例如,限制最多同时执行 3 个异步请求,如何实现?

考察点

  • 面试官考察你是否了解如何通过 Promise 控制并发,避免请求过多导致性能下降或网络拥堵。
  • 你是否能够自定义实现一个并发限制的工具。

回答提示
可以使用 Promise 结合队列控制并发数,确保同时运行的异步请求数不超过限定数量。

6. Promiseasync/await 的区别是什么,如何在实际中选择?

考察点

  • 你是否能解释 async/awaitPromise 的关系,以及它们的优缺点。
  • 你是否理解它们在实际开发中的选择标准。

回答提示
async/await 是基于 Promise 的语法糖,主要目的是使异步代码看起来像同步代码,从而提高可读性。两者的区别:

  • async/await 使代码更加简洁和直观,尤其在处理多个异步操作时。
  • Promise 提供了更多控制力,可以处理 .all().race() 等复杂情况。

7. 如何实现一个自定义的 Promise.finally,它在 Promise 链中的任何地方都会被调用?

考察点

  • 面试官希望考察你对 Promise 链的理解,特别是如何在不同的情况下执行某些清理工作。
  • 你是否能设计一个不依赖原生 finally 方法的实现。

回答提示
finally 主要用于无论 Promise 成功还是失败,都执行某些清理工作。你需要在自定义实现中,考虑到原生 Promise 状态的不可逆性。

8. 实现一个 Promise.allSettled,并解释它的行为和实现原理?

考察点

  • 面试官希望测试你对 Promise.allSettled 的理解和自定义实现能力。
  • 你是否知道 Promise.allSettled 的行为与 Promise.all 的区别,以及如何实现它。

回答提示
Promise.allSettled 在所有 Promise 完成(无论成功或失败)时返回。与 Promise.all 区别在于 Promise.all 遇到一个拒绝时立即失败,而 Promise.allSettled 会返回每个 Promise 的结果。

9. 结合宏任务微任务考察 Promise,Promise 在事件循环中的执行顺序是什么?

考察点

  • 面试官想了解你对 事件循环(Event Loop)的理解,特别是 microtaskmacrotask 的区别。
  • 是否理解 Promisethencatchfinally 在事件循环中的执行顺序。

回答提示: 在 JavaScript 中,异步操作分为宏任务(Macrotask)和微任务(Microtask)。Promise 的回调会被放入微任务队列中,而微任务在宏任务之前执行。

10. 如何实现一个 Promisedelay 函数,确保在给定时间后才执行某个操作,且保证该操作不会被意外打断?

考察点

  • 面试官希望了解你如何控制异步任务的执行延迟,防止任务被提前终止或意外中断。
  • 你是否了解异步操作中的延时控制与队列机制。

回答提示delay 函数可以通过返回一个 PromisesetTimeout 实现延迟。

以上这些问题和考察点可以帮助你更好地准备promise相关的面试,如果你能够深入了解每个技术细节,并且在面试中流利地回答这些问题,相信你一定能够给面试官留下深刻的印象!