# 2637. Promise Time Limit
###### tags: `leetcode 30 days js challenge` `Easy`
[2637. Promise Time Limit](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.
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.
```
**Constraints**:
- `0 <= inputs.length <= 10`
- `0 <= t <= 1000`
- `fn returns a promise`
### 解答
#### TypeScript
```typescript=
function timeLimit(fn: Fn, t: number): Fn {
return async function (...args) {
return new Promise(async (resolve, reject) => {
const timer = setTimeout(() => {
reject('Time Limit Exceeded');
}, t);
fn(...args)
.then((res) => {
clearTimeout(timer);
resolve(res);
})
.catch((err) => {
clearTimeout(timer);
reject(err);
});
});
};
}
```
使用 `Promise.race` 方法
```typescript=
function timeLimit(fn: Fn, t: number): Fn {
return async function (...args) {
const timer = new Promise((_, reject) => setTimeout(() => reject('Time Limit Exceeded'), t));
return Promise.race([fn(...args), timer]);
};
}
```
> [name=Sheep][time=Tues, May 16, 2023]
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)