interview
advanced-javascript-frontend
setTimeoutPromiseAsyncAwait 有什么区别

前端 JavaScript 进阶面试题, setTimeout,Promise,AsyncAwait 有什么区别?

前端 JavaScript 进阶面试题, setTimeout,Promise,AsyncAwait 有什么区别?

QA

Step 1

Q:: setTimeout、Promise、Async/Await 有什么区别?

A:: setTimeout 是一个用于设置定时任务的函数,接受一个回调函数和时间(以毫秒为单位)作为参数。在时间到达后,回调函数会被加入到事件队列中执行。Promise 是一种用于处理异步操作的对象,代表一个在未来某个时间点可能会被执行的操作。它有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Async/Await 是基于 Promise 的语法糖,使得异步代码看起来像同步代码。async 函数返回一个 Promise,await 用于等待 Promise 解决。

Step 2

Q:: 如何取消一个 setTimeout 计时器?

A:: 可以使用 clearTimeout 函数取消一个 setTimeout 计时器。调用 setTimeout 时会返回一个计时器 ID,传递这个 ID 给 clearTimeout 即可取消计时器。例如:const timerId = setTimeout(callback, 1000); clearTimeout(timerId);

Step 3

Q:: Promise 的状态一旦改变,还可以再变吗?

A:: 不能。Promise 的状态一旦从 pending 变为 fulfilled 或 rejected,就无法再变回 pending 或改变为其他状态。Promise 的状态是不可变的。

Step 4

Q:: async 函数中可以使用哪些关键字来处理异步操作?

A:: async 函数中可以使用 await 关键字来处理异步操作。await 关键字会暂停 async 函数的执行,等待 Promise 解决后继续执行。

Step 5

Q:: Async/Await 比 Promise 更方便的地方在哪里?

A:: Async/Await 使得异步代码看起来更像同步代码,读写更加直观,减少了嵌套层级(即回调地狱)。这提高了代码的可读性和可维护性。

用途

面试这些内容是因为在现代前端开发中,异步编程是必不可少的。JavaScript 本身是单线程的,但很多操作(如网络请求、定时任务、文件读取等)都是异步的。掌握 setTimeout、Promise 和 Async`/`Await 可以使开发者更有效地处理这些异步操作,从而提高应用的性能和用户体验。在实际生产环境中,几乎每一个前端项目都会用到这些技术,尤其是需要与后端进行数据交互的时候。\n

相关问题

🦆
Promise.all 和 Promise.race 有什么区别?

Promise.all 接受一个包含多个 Promise 的数组,当所有 Promise 都解决时,它返回一个包含所有结果的数组;如果其中一个 Promise 失败,它会立即拒绝。Promise.race 接受一个包含多个 Promise 的数组,当第一个 Promise 解决或拒绝时,它返回那个 Promise 的值或拒绝原因。

🦆
如何处理多个异步请求之间的依赖关系?

可以使用 Promise 链式调用或 Async/Await 来处理多个异步请求之间的依赖关系。Promise 链式调用通过 then 方法一个接一个地处理异步操作,而 Async/Await 则通过等待前一个异步操作完成后再进行下一个操作,使代码更清晰。

🦆
如何捕获 AsyncAwait 中的错误?

可以使用 try...catch 语句来捕获 Async/Await 中的错误。在 async 函数中,将 await 操作放在 try 块中,如果发生错误,catch 块会捕获并处理该错误。

🦆
什么是事件循环Event Loop?

事件循环是 JavaScript 的执行模型,负责协调调用堆栈、消息队列和任务队列。在单线程的 JavaScript 中,事件循环不断检查调用堆栈是否为空,并从消息队列中取出事件进行处理。通过事件循环,JavaScript 可以处理异步任务。

🦆
微任务Microtask和宏任务Macrotask有什么区别?

微任务(Microtask)包括 Promise 回调和 MutationObserver 回调,执行优先级高于宏任务。宏任务(Macrotask)包括 setTimeout、setInterval 和 I/O 操作。事件循环会在每次循环时先执行所有微任务,再执行一个宏任务。