110306041 / git-practice

0 stars 0 forks source link

Week 03 回覆 #3

Open azole opened 1 week ago

azole commented 1 week ago

HW A

不錯,以下兩個小問題:

HW B

你有寫出 promise 版本的程式碼,那跟 callback 版本的差異是什麼?

HW C

readme 非常完整,很好喔!

問你一個小問題: .env 檔案不上傳到 github 是正確的,那要怎麼讓團隊夥伴或新進同事知道這個專案有哪些設定?

這週作業進步很多,進階題也都有做,繼續保持。

以上可以回覆在 issue 這裡即可,要不要改回去原檔案自行判斷,但我建議要,讓自己的作業是完整的。

110306041 commented 1 week ago

1. 使用者是否可選擇所有 Region 來運行應用?

Ans: 不是所有,根據服務可用性不同(可能新推出的服務可能會先在少數幾個 Region 提供,或帳戶類型不同(某些新的或不活躍的帳戶可能無法立即使用某些高需求的 Region,例如美國東部 (us-east-1) 或歐洲 (eu-west-1)),還有專用地區限制(有些Region 主要用於特定的政府、國防機構等組織,並非所有 AWS 用戶都能選擇)

可以透過 AWS 的區域與服務可用性頁面查詢不同 Region 中哪些服務可用。

2. Latency 測試:如何測試 AWS Region 的延遲?

Ans: 有一些測試工具可以使用: 1. AWS Global Accelerator Latency Test 這個工具會測試從你的瀏覽器或伺服器到不同 AWS Region 的 Latency 情況,並且會提供你最佳的區域選擇。 AWS Global Accelerator Speed Comparison

截圖 2024-10-05 中午12 11 20

2. CloudPing 一個非官方的第三方工具,可以幫助測試從你的地理位置到不同 AWS Region 的延遲。 CloudPing

截圖 2024-10-05 中午12 12 37

3. promise 版本的程式碼,跟 callback 版本的差異是什麼?

Ans: Callback 版本:當工作變多時,程式碼會出現巢狀結構,逐漸形成 "callback hell"(隨著層次不斷加深,程式碼會逐漸向右縮排,看起來像是「金字塔」或「地獄」),如果在每個步驟中發生錯誤,還要額外處理錯誤,導致程式碼不易閱讀和維護。 Promise 版本:.then() 為鏈式結構而非巢狀結構,當一個 Promise 中發生錯誤時,它會自動將錯誤傳遞到最近的 .catch() 區塊。無論在哪一個步驟中出錯,都會被 .catch() 捕獲,可讀性也比較高。

Callback 版本 - 錯誤處理

function doJob(job, time, callback) {
  setTimeout(() => {
    let now = new Date();
    if (Math.random() > 0.7) {  // 模擬錯誤的發生
      callback(`Error: ${job} 失敗 at ${now.toISOString()}`, null);
    } else {
      callback(null, `完成工作 ${job} at ${now.toISOString()}`);
    }
  }, time);
}

console.log(`開始工作 at ${new Date().toISOString()}`);

// 使用 Callback 的錯誤處理,每個步驟都會檢查是否有錯誤發生
doJob("刷牙", 1000, (err, result) => {
  if (err) {
    console.error(err);
    return;  // 若有錯誤發生,終止後續操作
  }
  console.log(result);

  doJob("吃早餐", 3000, (err, result) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log(result);

    doJob("寫功課", 1000, (err, result) => {
      if (err) {
        console.error(err);
        return;
      }
      console.log(result);

      doJob("吃午餐", 2000, (err, result) => {
        if (err) {
          console.error(err);
          return;
        }
        console.log(result);
      });
    });
  });
});

Promise 版本 - 錯誤處理

function doJob(job, time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let now = new Date();
      if (Math.random() > 0.7) {  // 模擬錯誤的發生
        reject(`Error: ${job} 失敗 at ${now.toISOString()}`);
      } else {
        resolve(`完成工作 ${job} at ${now.toISOString()}`);
      }
    }, time);
  });
}

console.log(`開始工作 at ${new Date().toISOString()}`);

// 使用 Promise 的錯誤處理
doJob("刷牙", 1000)
  .then((result) => {
    console.log(result);
    return doJob("吃早餐", 3000);
  })
  .then((result) => {
    console.log(result);
    return doJob("寫功課", 1000);
  })
  .then((result) => {
    console.log(result);
    return doJob("吃午餐", 2000);
  })
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.error("發生錯誤:", error);
  });

4. .env 檔案不能上傳到 github 上,那要怎麼讓團隊夥伴或新進同事知道這個專案有哪些設定?

Ans:

  1. 建立 .env.example 檔案

    # .env.example 檔案
    DATABASE_HOST=localhost
    DATABASE_USER=your_username
    DATABASE_PASSWORD=your_password
    API_KEY=your_api_key
    PORT=3000

    團隊夥伴只需要將這個檔案複製成 .env,並填入實際值即可。

  2. 也可以在專案的 README.md 文件中,列出所有需要的環境變數

    ## 環境變數設定
    - `DATABASE_HOST`: 資料庫主機名稱
    - `DATABASE_USER`: 資料庫使用者名稱
    - `DATABASE_PASSWORD`: 資料庫使用者密碼
    - `API_KEY`: 用於外部 API 認證的金鑰
    - `PORT`: 專案運行的本地端埠號