[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]);
};
};