⭐️

# 題目敘述

Given an asyncronous function fn and a time t in milliseconds, return a new time limited version of the input function.

A time limited function is a function that is identical to the original unless it takes longer than t milliseconds to fullfill. In that case, it will reject with "Time Limit Exceeded" . Note that it should reject with a string, not an Error .

# 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:
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.

# Solution

/**
 * @param {Function} fn
 * @param {number} t
 * @return {Function}
 */
var timeLimit = function(fn, t) {
	return async function(...args) {
        const orgfn = fn(...args);
        const timeoutfn = new Promise((resolved, reject) => {
            setTimeout(() => reject("Time Limit Exceeded"), t);
        });
        return Promise.race([orgfn, timeoutfn]);
    }
};
/**
 * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100);
 * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms
 */
type Fn = (...params: any[]) => Promise<any>;
function timeLimit(fn: Fn, t: number): Fn {
	return async function(...args) {
        const orgfn = fn(...args);
        const timeoutfn = new Promise((resolve, reject) => {
            setTimeout(() => reject("Time Limit Exceeded"), t);
        });
        return Promise.race([orgfn, timeoutfn]);
    }
};
/**
 * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100);
 * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms
 */