列表

详情


2637. 有时间限制的 Promise 对象

请你编写一个函数,它接收一个异步函数 fn 和一个以毫秒为单位的时间 t。它应根据限时函数返回一个有 限时 效果的函数。

限时函数是与原函数相同的函数,除非它需要 t 毫秒以上的时间来完成。如果出现了这种情况,请你返回 "Time Limit Exceeded" 拒绝这次函数的调用。注意,它应该返回一个字符串拒绝,而不是一个 Error 。

 

示例 1:

输入:
fn = async (n) => { 
  await new Promise(res => setTimeout(res, 100)); 
  return n * n; 
}
inputs = [5]
t = 50
输出:{"rejected":"Time Limit Exceeded","time":50}
解释:
提供的函数设置在 100ms 后执行完成,但是设置的超时时间为 50ms,所以在 t=50ms 时拒绝因为达到了超时时间。

示例 2:

输入:
fn = async (n) => { 
  await new Promise(res => setTimeout(res, 100)); 
  return n * n; 
}
inputs = [5]
t = 150
输出:{"resolved":25,"time":100}
解释:
在 t=100ms 时执行 5*5=25 ,没有达到超时时间。

示例 3:

输入:
fn = async (a, b) => { 
  await new Promise(res => setTimeout(res, 120)); 
  return a + b; 
}
inputs = [5,10]
t = 150
输出:{"resolved":15,"time":120}
解释:
在 t=120ms 时执行 5+10=15,没有达到超时时间。

示例 4:

输入:
fn = async () => { 
  throw "Error";
}
inputs = []
t = 1000
输出:{"rejected":"Error","time":0}
解释:
此函数始终丢出 Error

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * @param {Function} fn * @param {number} t * @return {Function} */ var timeLimit = function(fn, t) { return async function(...args) { } }; /** * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100); * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms */

typescript 解法, 执行用时: 72 ms, 内存消耗: 42.3 MB, 提交时间: 2023-09-12 10:04:23

type Fn = (...params: any[]) => Promise<any>;

function timeLimit(fn: Fn, t: number): Fn {
	return async function(...args) {
        let timer;
        const timeoutPromise = new Promise((res,rej) => {
            timer = setTimeout(() => rej('Time Limit Exceeded'), t)
        });

        return Promise.race([fn(...args),timeoutPromise]).then(res => {
            clearTimeout(timer);
            return res;
        });
    }
};

/**
 * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100);
 * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms
 */

javascript 解法, 执行用时: 52 ms, 内存消耗: 41 MB, 提交时间: 2023-04-17 15:27:57

/**
 * @param {Function} fn
 * @param {number} t
 * @return {Function}
 */
var timeLimit = function(fn, t) {
	return async function(...args) {
        return Promise.race([
            fn(...args), 
            new Promise((r,j) => setTimeout(() => j('Time Limit Exceeded'), t))
        ]);
    }
};

/**
 * const limited = timeLimit((t) => new Promise(res => setTimeout(res, t)), 100);
 * limited(150).catch(console.log) // "Time Limit Exceeded" at t=100ms
 */

上一题