Talentd
FleetCode

2715. Timeout Cancellation

Easy89.1% acceptance2 companies

Given a function fn, an array ofĀ argumentsĀ args, and a timeoutĀ tĀ in milliseconds, return a cancel function cancelFn.

After a delay of cancelTimeMs, the returned cancel function cancelFn will be invoked.

setTimeout(cancelFn, cancelTimeMs)

Initially, the execution of the function fn should be delayed by t milliseconds.

If, before the delay of t milliseconds, the function cancelFn is invoked, it should cancel the delayed execution of fn. Otherwise, if cancelFn is not invoked within the specified delay t, fn should be executed with the provided args as arguments.

Example 1:

Input: fn = (x) => x * 5, args = [2], t = 20
Output: [{"time": 20, "returned": 10}]
Explanation: 
const cancelTimeMs = 50;
const cancelFn = cancellable((x) => x * 5, [2], 20);
setTimeout(cancelFn, cancelTimeMs);

The cancellation was scheduled to occur after a delay of cancelTimeMs (50ms), which happened after the execution of fn(2) at 20ms.

Example 2:

Input: fn = (x) => x**2, args = [2], t = 100
Output: []
Explanation: 
const cancelTimeMs = 50;
const cancelFn = cancellable((x) => x**2, [2], 100);
setTimeout(cancelFn, cancelTimeMs);

The cancellation was scheduled to occur after a delay of cancelTimeMs (50ms), which happened before the execution of fn(2) at 100ms, resulting in fn(2) never being called.

Example 3:

Input: fn = (x1, x2) => x1 * x2, args = [2,4], t = 30
Output: [{"time": 30, "returned": 8}]
Explanation: 
const cancelTimeMs = 100;
const cancelFn = cancellable((x1, x2) => x1 * x2, [2,4], 30);
setTimeout(cancelFn, cancelTimeMs);

The cancellation was scheduled to occur after a delay of cancelTimeMs (100ms), which happened after the execution of fn(2,4) at 30ms.

Constraints:

  • fn is a function
  • args is a valid JSON array
  • 1 <= args.length <= 10
  • 20 <= t <= 1000
  • 10 <= cancelTimeMs <= 1000

Asked at 2 companies

11:55
Still stuck?Read 3 approaches, or watch a walkthrough.
Open solution
Loading editor…
1/**
2 * @param {Function} fn
3 * @param {Array} args
4 * @param {number} t
5 * @return {Function}
6 */
7var cancellable = function(fn, args, t) {
8
9};
10
11/**
12 * const result = [];
13 *
14 * const fn = (x) => x * 5;
15 * const args = [2], t = 20, cancelTimeMs = 50;
16 *
17 * const start = performance.now();
18 *
19 * const log = (...argsArr) => {
20 * const diff = Math.floor(performance.now() - start);
21 * result.push({"time": diff, "returned": fn(...argsArr)});
22 * }
23 *
24 * const cancel = cancellable(log, args, t);
25 *
26 * const maxT = Math.max(t, cancelTimeMs);
27 *
28 * setTimeout(cancel, cancelTimeMs);
29 *
30 * setTimeout(() => {
31 * console.log(result); // [{"time":20,"returned":10}]
32 * }, maxT + 15)
33 */
Starter codeJavaScriptSpaces: 4
Examples
Input
(x) => x * 5
[2]
20
50
Input
(x) => x**2
[2]
100
50
Input
(x1, x2) => x1 * x2
[2,4]
30
100
Your code is saved on this device.Solution