---
# System prepended metadata

title: "\U0001F3C5 Day 2 - Promise 運用"
tags: [Node.js 直播班 - 2024 春季班]

---

# 🏅 Day 2 - Promise 運用
建立好 Promise 後，就可以在完成 Promise 時使用 `.then()` 接收回傳的 Promise 物件，以及使用 `.catch()` 接收錯誤，因 Promise 可以用鏈式寫法接收回傳值，不需像使用 callback function 一層包一層，因此可以提昇易讀性

- `.then()`：接收 resolve 傳遞的資料
- `.catch()`：接收 reject 傳遞的資料

以前一天解答為例：
```javascript=
const checkRoomRating = new Promise((resolve, reject) => {
  const roomRating = 4;
  if (roomRating >= 3) {
    resolve(roomRating);  
  } else {
    reject('未達評分標準');
  }
});

// 呼叫 checkRoomRating，使用 .then .catch 接收回傳值，並執行後續操作
checkRoomRating
  .then((data) => {
    console.log(data);  // 印出 roomRating 的值
  })
  .catch((error) => {
    console.log(error); // 印出 '未達評分標準' 
  })
```

### 帶入參數
要讓函式可以帶入參數，可以調整成如下寫法（改寫上方範例），回傳整個 Promise 物件
```javascript=
const checkRoomRating = roomRating => {
  return new Promise((resolve, reject) => {
    // const roomRating = 4; 改為使用參數帶入
    if (roomRating >= 3) {
      resolve(roomRating);  
    } else {
      reject('未達評分標準');
    }
  });
};

checkRoomRating(4)
  .then((data) => {
    console.log(data);  // 印出 roomRating 的值
  })
  .catch((error) => {
    console.log(error); // 印出 '未達評分標準' 
  })
```


### 參考資源
- [Using Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises)
- [JavaScript Promise 全介紹 | 卡斯伯 Blog - 前端，沒有極限](https://www.casper.tw/development/2020/02/16/all-new-promise/)
- 課程影音「Node.js 非同步技巧 - Promise、Async、Await」


題目
---
以下 `historyOrdersData` 資料為某飯店的訂房紀錄，
請調整 `...` 的部分，完整程式碼，讓程式碼符合以下流程：
- 運用 `getUserData(使用者名稱)` 取得使用者訂房紀錄，若未訂過會印出 `該使用者無訂房紀錄`；若有訂房過會計算該使用者的累計訂房金額，並傳遞使用者資料 `（使用者名稱、訂房次數、累計訂房金額）`
- 接續使用 `checkVip(傳遞的資料)` 確認是否達到升級 VIP 資格（累計訂房金額達 10000 元）
    - 符合資格：印出 `累計訂房金額： ... 元，已達升級 VIP 會員資格`
    - 不符合資格：印出 `還差 ... 元，才可升級 VIP 會員`

```javascript=
const historyOrdersData = [{
  room: '豪華雙人房',
  price: 3200,
  user: 'Tom'
},{
  room: '高級雙人房',
  price: 2800,
  user: 'Tom'
},{
  room: '高級雙人房',
  price: 2800,
  user: 'Tommy'
}];

const getUserData = (name) => {
  return new Promise((resolve, reject) => {
    const data = {
      user: ...,      // 使用者名稱
      orderSum: 0,    // 累計訂房金額
      orderTimes: 0,  // 訂房次數
    };
      
    // 計算累計訂房金額
    historyOrdersData.forEach((item) => {
      if (item.user === ...) {
        data.orderSum += ...;
        data.orderTimes += 1;
      }
    });
    
    // 確認是否有訂房紀錄
    if (data....) {
      resolve(...);
    } else {
      reject('...');
    }
  })
};

const checkVip = (data) => {
  return new Promise((resolve, reject) => {
    if (data.orderSum >= ...) {
      resolve(`累計訂房金額： ${...} 元，已達升級 VIP 會員資格`);
    } else {
      const price = 10000 - ...;
      reject(`還差 ${price} 元，才可升級 VIP 會員`);
    }
  });
};

getUserData('Tom')
  ....(data => ...)
  ....(isVipStr => console.log(isVipStr))
  ....(error => console.log(error))
```




## 回報流程

將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 
解答位置請參考下圖（需打開程式碼的部分觀看）

![](https://i.imgur.com/vftL5i0.png)

<!-- 解答：  

```javascript=
const historyOrdersData = [{
  room: '豪華雙人房',
  price: 3200,
  user: 'Tom'
},{
  room: '高級雙人房',
  price: 2800,
  user: 'Tom'
},{
  room: '高級雙人房',
  price: 2800,
  user: 'Tommy'
}];

const getUserData = (name) => {
  return new Promise((resolve, reject) => {
    const data = {
      user: name,
      orderSum: 0,
      orderTimes: 0,
    };
    historyOrdersData.forEach((item) => {
      if (item.user === name) {
        data.orderSum += item.price;
        data.orderTimes += 1;
      }
    });
    if (data.orderTimes) {
      resolve(data);
    } else {
      reject('該使用者無訂房紀錄');
    }
  })
};

const checkVip = (data) => {
  return new Promise((resolve, reject) => {
    if (data.orderSum >= 10000) {
      resolve(`累計訂房金額： ${data.orderSum} 元，已達升級 VIP 會員資格`);
    } else {
      const price = 10000 - data.orderSum;
      reject(`還差 ${price} 元，才可升級 VIP 會員`);
    }
  });
};

getUserData('Tom')
  .then(data => checkVip(data))
  .then(isVipStr => console.log(isVipStr))
  .catch(error => console.log(error))
```
-->




回報區
---
<!-- 
將答案貼至下方表格內，格式：
| Discord 暱稱 | [CodePen](連結) |
-->

|    Discord    |   CodePen ／ 答案  |
|:-------------:|:-----------------:|
| xxx | [CodePen]() |
| 2魚. | [CodePen](https://codepen.io/ijrekmsn-the-sans/pen/poBdeRY) |
|Lobinda | [CodePen](https://codepen.io/Lobinda/pen/WNWXMjN) |
|Tiya | [CodePen](https://codepen.io/Tiya_blank/pen/YzMeQwR) |
| william威良 | [CodePen](https://codepen.io/snowman12320/pen/jORZwwM) |
| 寬寬 | [CodePen](https://codepen.io/ks960037/pen/PogQjVZ) |
| ChrisT | [CodePen](https://codepen.io/r37111081/pen/QWPQgKy) |
| Chia Pin | [CodePen](https://codepen.io/joker-cat/pen/jORZLVZ) |
render_lai | [CodePen](https://codepen.io/hsinhui/pen/RwOQZOV)
|  cbs  |[Codepen](https://codepen.io/wasdjk/pen/poBaWLo?editors=1111)|
|  AL  |[Codepen](https://codepen.io/allisonlai/pen/eYoVePV)|
|  Johlmike  |[Codepen](https://codepen.io/johlmike/pen/rNbJJmV)|
|  kelvinnn  |[Codepen](https://codepen.io/is-lin/pen/ZEZrxmv)|
|群嘉|[CodePen](https://codepen.io/efzdamnp-the-lessful/pen/WNWMJbO?editors=0012)|
| zaoannihao | [CodePen](https://codepen.io/ckhwdvrx-the-solid/pen/dyLdeNy) |
| shuantt  | [CodePen](https://codepen.io/th-tseng/pen/wvZyjrq)|
| Theodore | [CodePen](https://codepen.io/GustavoFringgg/pen/wvZyXJY?editors=1011) |
| yiling4054 | [CodePen](https://codepen.io/lin010/pen/qBwxGBb?editors=1011) |
| Alan | [CodePen](https://codepen.io/l0f0/pen/eYoVwrG?editors=1111) |
| tung030374 | [CodePen](https://codepen.io/tung__u/pen/abxqeYr?editors=0012) |
| wei | [CodePen](https://codepen.io/Wei-the-sasster/pen/qBwoRjo?editors=0011)|
|cho|[CodePen](https://codepen.io/cho195/pen/VwNXPBq)|
|ellallu0903|[CodePen](https://codepen.io/ellallu0903/pen/dyLmZGm)|
|風清羊|[Codepen](https://codepen.io/bryanlincode/pen/RwOMjRY)|
| YC | [CodePen](https://codepen.io/YCLu/pen/XWQEzKp)|
| 羽 | [CodePen](https://codepen.io/lingling-Syu/pen/NWmYwjW?editors=0011)|
| RayRay | [CodePen](https://codepen.io/CityRay/pen/oNOqoVQ)|
| Jean | [CodePen](https://codepen.io/jeanchiang1221/pen/rNbdYLW)|
| Ingridkao | [CodePen](https://codepen.io/ingrid_kao/pen/ZEZxvGv?editors=1011)|
| Otis | [CodePen](https://codepen.io/humming74/pen/rNbdpMK?editors=1111)|
| Aida | [CodePen](https://codepen.io/ada23410/pen/GRLxQPd?editors=0011)|
| 阿旭 | [CodePen](https://codepen.io/1997-work/pen/eYoMrmy?editors=1011)|
| 瑀君 | [CodePen](https://codepen.io/yennnnn/pen/VwNXdbP?editors=1112)|
| william_hsu | [CodePen](https://codepen.io/william8815/pen/BaErPWe)|
| ej_chuang | [CodePen](https://codepen.io/EJChuang/pen/OJGvwQe)|
| YJ | [CodePen](https://codepen.io/y0000ga/pen/eYoMxLY)|
| 苡安 | [CodePen](https://codepen.io/yi-an-yang/pen/QWPrWMW?editors=1112)|
| Ciel | [CodePen](https://codepen.io/nycteachen/pen/VwNxjYr)|
| blp100x | [CodePen](https://codepen.io/blp100/pen/WNWJpOR)|
| Tippy | [CodePen](https://codepen.io/Ektodor-Wang/pen/rNbvpdK)|
| 圈圈 | [CodePen](https://codepen.io/wjejfczn-the-bold/pen/zYXjLbd) |
| Hank | [CodePen](https://codepen.io/tw1720/pen/bGJMjXN)|
| Fabio20 | [CodePen]([連結](https://codepen.io/fabio7621/pen/XWQYJRV?editors=0010)) |
| runweiting | [CodePen](https://codepen.io/weiting14/pen/ExJRpKV) |
| Thomas | [CodePen](https://codepen.io/ThomasYeh/pen/oNOyaKL) |
| Sophiee | [CodePen](https://codepen.io/sophiee2727/pen/zYXabEr) |
|Mei| [Codepen](https://codepen.io/l_umei/pen/VwNBbrY)|
|Esther| [Codepen](https://codepen.io/xueefddg-the-sans/pen/PogBRPJ)|
|jenny7532| [Codepen](https://codepen.io/wei-chen-wu/pen/WNWKKaP?editors=1111)|
| Henry | [Codepen](https://codepen.io/hekman1122/pen/mdgjGxo?editors=0012) |
| yoshidc | [CodePen](https://codepen.io/yoshiyyc/pen/mdgjNVj) |
| Benson | [CodePen](https://codepen.io/nosneb83/pen/LYvJxNV) |
| aprilccc | [CodePen](https://codepen.io/vocalise_com/pen/MWRqoYq) |
| jules | [CodePen](https://codepen.io/cjntfsoq-the-animator/pen/OJGozzq?editors=1111) |
| Ching | [CodePen](https://codepen.io/huangching/pen/rNbQGoY) |
| albertyang3576 | [CodePen](https://codepen.io/albertyang3576/pen/KKYENOK) |
| SKey | [CodePen](https://codepen.io/Dale-Chien/pen/BaeaLQx) |
| 柚子 | [CodePen](https://codepen.io/joker-cat/pen/jORZLVZ?editors=1112) |
| 郭芙蘭 | [CodePen](https://codepen.io/flora_Kuo/pen/QWRwjZO?editors=0012) |
|puffy_chen|[CodePen](https://codepen.io/TernMayDay/pen/ExzVdoV?editors=1111)
