---
# System prepended metadata

title: JavaScript概念-Ajax ＆Promise

---


#### 什麼是同步代碼
1. 單線程的程式執行方式
2. 每行程式會像排隊依樣依序執行，此方式可能會造成當有程式卡住時後面程式也會跟著卡住，需要花很長的時間進行等待

#### 什麼是非同步代碼
1. 非單線程執行方式
2. 程式執行的時候會調用callback. function 在任務的背後運轉，其他的程式會繼續往下執行，等到callback. function完成任務，會回傳結果

#### 什麼是AJAX
Asynchronous JavaScrupt And XML(AJAX)
使用異步的方式與web sever進行動態資料請求。在不需要加在頁面的情況下就可以做資料的更新。
XML是一種數據格式，用於數據的傳輸，現今已經沒有API再使用XML格式，都是使用json格式。

XML Http Request function
```javascript!
const req = new XMLHttpResuest();
req.open('GET', 'https://restcountries.eu/rest/v2')
req.send()
//發出請求 send request

req.addEventListener('load', ()=>{
console.log(this.responseText)
    //輸出的內容是json
    
    //將json資料解析為object格式
const data=JSON.parse(this.responseText)
console.log(data)
})

```

---

### Promise
Promise 是在 ES6 出現的新功能，並且是用來優化過去回調函式的寫法。

Promise 照英文上的意思，是約定、承諾，它代表的意涵是這個約定請求會在未來每個時刻返回數據給調用者。在 MDN 文件中， Promise 是用來表示一個異步操作的最终完成（或失敗）及其结果值。

優點：
1. 使用Promise讓我們可以**不在需要依賴事件和回調函數來處理異步結果**，如此可以避免事件和回調函數有時會得到不可預測的結果。
2. Promise使用**異步操作鏈(Promise chain)**，不會造成callback hell

#### Promise Lifecycle
![Course_ The Complete JavaScript Course 2024_ From Zero to Expert! _ Udemy (4)](https://hackmd.io/_uploads/SJUTfx-H6.png)

一個 Promise 中會有三種狀態，會影響`.then` `.catch` 的執行結果
1. **Pending**: 當建立一個Promise會處於Pending初始狀態，此時 Promise 還沒有任何結果。在 Pending 狀態下， then 和  catch都不會執行，直到狀態改變。 
2. **Fulfilled**: Promise成功獲取一個值時的狀態，此時 Promise 會呼叫`result`函式來傳遞這個值，`catch`方法的參數會被執行。
3. **Rejected**: Promise獲取失敗時的狀態，此時 Promise 會呼叫`reject`函式來傳遞這個值，`then`方法的參數會被執行。

#### Consuming Promise
指使用 promise 物件的程式碼，也就是要等待 promise 物件的結果的程式碼。通常會使用 `then` 和 `catch `方法來呼叫callback function，這些函式會在 promise 物件實現(resolve)或拒絕(reject)時被呼叫，並接收 promise 物件的值或錯誤。程式碼可以用來處理非同步操作的結果，例如發送網路請求、讀取檔案、設定計時器等。
```javascript!
const lotteryPromise = new Promise((resolve, reject) => {
  console.log("Lotter draw is happening 🔮");
  setTimeout(() => {
    if (Math.random() >= 0.5) {
      resolve("You Win 💰");
    } else {
      reject(new Error("You lost 💩"));
    }
  }, 2000);
});

lotteryPromise
  .then((ress) => console.log(ress))
  .catch((err) => console.error(err));

//---promise 的setTimeout

const wait = function (ss) {
  return new Promise((resolve) => {
    setTimeout(resolve, ss * 1000);
  });
};

wait(1)
  .then(() => {
    console.log("1 second");
    return wait(1);
  })
  .then(() => {
    console.log("2 second");
    return wait(1);
  })
  .then(() => {
    console.log("3 second");
    return wait(1);
  })
  .then(() => {
    console.log("4 second");
    return wait(1);
  });
```
#### Promise語法糖 -async await


更詳細內容[另一篇筆記](https://)