Recent Posts
Recent Comments
게으른개발너D
[Promise] Promise Time Limit (feat. race) ⭐️ 본문
https://leetcode.com/problems/promise-time-limit/
Given an asynchronous function fn and a time t in milliseconds, return a new time limited version of the input function. fn takes arguments provided to the time limited function.
The time limited function should follow these rules:
- If the fn completes within the time limit of t milliseconds, the time limited function should resolve with the result.
- If the execution of the fn exceeds the time limit, the time limited function should reject with the string "Time Limit Exceeded".
Example 1:
Input:
fn = async (n) => {
await new Promise(res => setTimeout(res, 100));
return n * n;
}
inputs = [5]
t = 50
Output: {"rejected":"Time Limit Exceeded","time":50}
Explanation:
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)};
}
console.log(result) // Output
The provided function is set to resolve after 100ms. However, the time limit is set to 50ms. It rejects at t=50ms because the time limit was reached.
Example 2:
Input:
fn = async (n) => {
await new Promise(res => setTimeout(res, 100));
return n * n;
}
inputs = [5]
t = 150
Output: {"resolved":25,"time":100}
Explanation:
The function resolved 5 * 5 = 25 at t=100ms. The time limit is never reached.
Example 3:
Input:
fn = async (a, b) => {
await new Promise(res => setTimeout(res, 120));
return a + b;
}
inputs = [5,10]
t = 150
Output: {"resolved":15,"time":120}
Explanation:
The function resolved 5 + 10 = 15 at t=120ms. The time limit is never reached.
Example 4:
Input:
fn = async () => {
throw "Error";
}
inputs = []
t = 1000
Output: {"rejected":"Error","time":0}
Explanation:
The function immediately throws an error.
Constraints:
- 0 <= inputs.length <= 10
- 0 <= t <= 1000
- fn returns a promise
solution
/**
* @param {Function} fn
* @param {number} t
* @return {Function}
*/
var timeLimit = function(fn, t) {
return async function(...args) {
const resolved = fn(...args);
const rejected = new Promise((_, reject) => {
setTimeout(() => {
reject('Time Limit Exceeded')
}, t)
});
return Promise.race([resolved, rejected]);
}
};
/**
* const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100);
* limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms
*/
solution2
/**
* @param {Function} fn
* @param {number} t
* @return {Function}
*/
var timeLimit = function(fn, t) {
return async function(...args) {
return new Promise((resolve, reject) => {
let timerId;
fn(...args)
.then(result => {
resolve(result);
})
.catch(error => {
reject(error);
}).finally(() => {
clearTimeout(timerId);
});
timerId = setTimeout(() => {
reject('Time Limit Exceeded');
}, t);
});
};
};
Promise.race()
Promise 생성자를 여러개 만든 후, 그 중 가장 빠르게 종료되는 것을 return함.
'알고리즘 > 과제' 카테고리의 다른 글
[Function, Closure, Class] Counter II (closure 함수 여러개 넣기) ⭐️ (0) | 2023.07.03 |
---|---|
[Generator] Generate Fibonacci Sequence ⭐️ (0) | 2023.07.03 |
[Array] Apply Transform Over Each Element in Array (map 구현하기) (0) | 2023.07.03 |
[Array] Filter Elements from Array (filter 구현하기) (0) | 2023.07.03 |
[Function, Closure] Function Composition (feat. reduceRight) (0) | 2023.07.03 |
Comments