[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 上追蹤我們