---
# System prepended metadata

title: 同步 & 非同步 & promise
tags: [JavaScript, JS 直播班  - 2021 秋季班]

---

# 同步 & 非同步 & promise
###### tags: `JavaScript` `JS 直播班  - 2021 秋季班`

## 同步
1. 執行程式是由上往下照順序跑下來
![](https://i.imgur.com/1OeTq0v.png)

## 非同步
```=JavaScript
let data = '';
    setTimeout(() => {
      data = '小明';
    }, 10);
    console.log(data);
```
![](https://i.imgur.com/Bo3VRps.png)

說明:
一開始 data 設為空字串 ， setTimeout() 將 data 設定為 '小明' 並延遲10秒 ， 再 console.log 出 data ， 執行完的地方會放入一個 event queue ， 而這個 setTimeout 則會擺在最後再來執行 ， 所以 console.log 只會將 data 顯示為空字串，就算把延遲10秒改成0秒也是

## 什麼是　promise
promise 是一個語法 ， 專門處理非同步問題
以下是一個 promise 函式
```=JavaScript
    const promiseSetTimeout = (status) => {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          if (status) {
            resolve('promiseSetTimeout 成功')
          } else {
            reject('promiseSetTimeout 失敗')
          }
        }, 10);
      })
    }
```
### promise 兩種結果
Promise是一個function ， resolve 會回傳成功的結果 ， reject 會回傳失敗的結果 ， 情況只會擇一不會同時發生!
![](https://i.imgur.com/6oJ570o.png)

### 如果成功則執行then，記得then跟catch要一起加上去，不一定每次都成功~
```=JavaScript
// #1 示範案例：成功
    promiseSetTimeout(1)
    .then(res=>{
      console.log(res);
    })
    .catch(err=>{
      console.log(err);
    })
```

### 如果失敗則catch捕捉失敗
```=JavaScript
// #2 示範案例：失敗
    promiseSetTimeout(0)
    .then(res=>{
        console.log(res);
    })
    .catch(err=>{
      console.log(err);
    })
```
### promise 串接，執行完之後接下去再執行(解決非同步)
```=JavaScript
  // #3 示範案例：鏈接
    promiseSetTimeout(1)
    .then(res=>{
      console.log(res);
      return promiseSetTimeout(1);  //再回傳一個 promise 來進行執行下一個then，可串接很多個~
    })
    .then(res=>{
      console.log(res);
    })
    .catch(err=>{
      console.log(err);
    })
```

### 如果串接中途發生錯誤的話呢?

Ans : 會從錯誤的地方直接跳到 catch ， 中間的 then 並不會被執行 ， 但是 catch 之後的 then 還會繼續接著執行

## 實際用 axios 來進行串接範例~
```=JavaScript
 axios.get("https://randomuser.me/api/")
    .then(res=>{
      console.log(res.data);
      const {seed}=res.data.info;
      return axios.get(`https://randomuser.me/api/?seed=${seed}`)
    })
    .then(res=>{
      console.log(res.data);
    })
    .catch(err=>{
      console.log(err);
    })
```