---
# System prepended metadata

title: 面試考題 2024 - Promise vs Async/Await 的關係

---

面試考題 2024 - Promise vs Async/Await 的關係
===

![image](https://hackmd.io/_uploads/ryWGwvg70.png)


---
###### tags: `面試問題`, `練習問題`, `2024`

看過英文和中文版本的解說，發現英文版本的解說比較人性比較舒服。

> A promise is an assurance or guarantee that something will happen in the future. In JavaScript, a Promise is an object that will produce a single value some time in the future.

![image](https://i.gifer.com/Pxwc.gif)

意思是說，Promise 是一個承諾，承諾說未來一定會完成的。我覺得挺浪漫的。
反倒中文版本的呢，就比較生硬一些：

在JavaScript裡， **Promise 是一種用於 異步計算 的對象。**
它代表了一個最終可能完成或失敗的操作和其結果值。使用 Promise 可以讓你阻止異步代碼，讓程式知道不需要等你的結果才render 結果，可以先預先運作不修改的部分，等異步完成再做統計和顯現結果。這樣可以有效避免異步操作中常見的 **回調地獄（Callback Hell）**

這裡也可以參考 Eventloop 的運作流程，因為其中流程可以有效地說明流程中什麼部分進行Promise，Promise最終回到哪裡做運算等。
![image](https://hackmd.io/_uploads/Hk3IEie70.png)


### 特點：
1. 狀態：
    - 一個 **Promise** 對象具有三種狀態： pending（等待中），fulfilled（已實現） 和 rejected（已拒絕）。

2. 不可變性： 
    - 一旦 **promise** 的狀態改變（從 pending 到 fulfilled 或 rejected），它的狀態將永遠不會再變。

3. 鏈式調用：
    - **promise** 提供了 **then** 和 **catch** 方法來處理 fulfilled 或 rejected 狀態的結果。 這些方法返回新的Promise，允許進行鏈式調用。

---
## Async/Await

**async/await 是建立在Promise上的語法糖**。它允許你以更直觀的方式使用 promise，使異步代碼看起來和普通的同步代碼類似。

![image](https://hackmd.io/_uploads/S1CwVigm0.png)
（這圖其實是Eventloop機制，但裡面有提到把東西放進callback queqe，promise就類似這樣。）


### 特點 ：

1. 簡潔性：
    - **async/await** 讓異步代碼的編寫更加簡潔，提高了代碼的可讀性。

2. 錯誤處理：
    - 可以使用傳統的**try-catch** 語句來捕獲異步代碼中的錯誤，這比使用 **promise 的 .catch()** 更加直觀。

3. 同步流控制：

    - **await** 關鍵字可以“**暫停**” **async** 函數的執行，等待promise解決，然後繼續執行下一行代碼。


## Promise 和 async/await 的差異

1. 語法和可讀性：
    - **Promise** 通常需要使用 .**then()** 和 .**catch()** 方法來處理異步結果，這可能導致代碼多層嵌套，尤其是在處理多個依賴的異步操作時。
    - **async/await** 提供了一種更加簡潔和直觀的方式來處理異步操作，讓代碼看起來更像是同步的，**減少了嵌套，並改善了可讀性**。

2. 錯誤處理：
    - 使用 **promise** 時，錯誤需要通過 .**catch()** 方法來捕獲
    - 使用 **async/await** 時，可以直接用 **try-catch** 語句來處理異步操作中的錯誤，這使得錯誤處理與同步代碼的錯誤處理更為一致。

3. 控制流：
    - **Promise** 的鏈式調用有時可以使得流程控制**變得不這麼直觀**，特別是在需要更多個條件分支或循環時。
    - **async/await** 可以使用標準的控制流語句（**如 if-else, for 循環**），使得異步代碼的流程控制更為**自然和簡單**。


## 總結：

簡單來說呢， async/await 提供了一種**更加簡潔和易於理解**的方式來使用 Promise ，特別是當處理複雜的異步流程時，然而， async/await 依然依賴於 Promise 作為其運作機制的基礎，**因此兩者並不是相互獨立的，而是互相補充**。
它是很簡單的東東，但考試都會問，所以還是了解下吧，面試加油咯！peace

![image alt](https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYXg4Znc1MDNtYnZydXE0aDNxNmh0dnhscjU3YzhpcmJjaHVwMjJjaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/fxe8v45NNXFd4jdaNI/giphy.gif)

