[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)};
}
原本傳入的 Promise 在 100 毫秒後會解析,
但時間限制是 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]);
};
};