[Medium] LeetCode JS 30 - 2637. Promise Time Limit

2024年3月6日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

LeetCode 30 Days of JavaScript

本題來自 LeetCode 的 30 天 JacaScript 挑戰

2637. Promise Time Limit

題目描述

給定一個非同步函式 fn 和一個時間限制 t(以毫秒為單位),回傳一個具有時間限制(time limited)版本的函式。 fn 會接受具有時間限制(time limited)函式的參數。

這個具有時間限制(time limited)的函式要符合以下條件:

  • 如果  fn  在  t  毫秒的時間限制內完成,則具有時間限制(time limited)的函式應該解析(resolve)為  fn  的結果。
  • 如果  fn  的執行時間超過了時間限制,則具有時間限制(time limited)的函數應該拒絕(reject),並返回字串  "Time Limit Exceeded"
// 範例
輸入:
fn = async (n) => {
  await new Promise(res => setTimeout(res, 100));
  return n * n;
}
inputs = [5]
t = 50

輸出: {"rejected":"Time Limit Exceeded","time":50}

解說:
const limited = timeLimit(fn, t)
const start = performance.now()
let result;
try {
   const res = await limited(...inputs)
   result = {"resolved": res, "time": Math.floor(performance.now() - start)};
} catch (err) {
   result = {"rejected": err, "time": Math.floor(performance.now() - start)};
}

原本傳入的 Promise100 毫秒後會解析,
但時間限制是 50 毫秒,
所以在 t=50 毫秒時,Promise 被拒絕

本題解答

以下是本題的解答,詳細解題思路可以在 E+ 成長計畫 看到。如果想練習更多題目,推薦可以到 GreatFrontEnd 上練習。

解法

var timeLimit = function (fn, t) {
  return (...args) => {
    const timeoutPromise = new Promise((resolve, reject) => {
      setTimeout(() => reject("Time Limit Exceeded"), t);
    });

    const fnPromise = fn(...args);
    return Promise.race([fnPromise, timeoutPromise]);
  };
};
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們