{ "data": { "question": { "questionId": "2862", "questionFrontendId": "2725", "boundTopicId": null, "title": "Interval Cancellation", "titleSlug": "interval-cancellation", "content": "
Given a function fn
, an array of arguments args
, and an interval time t
, return a cancel function cancelFn
.
The function fn
should be called with args
immediately and then called again every t
milliseconds until cancelFn
is called at cancelTimeMs
ms.
\n
Example 1:
\n\n\nInput: fn = (x) => x * 2, args = [4], t = 35\nOutput: \n[\n {"time": 0, "returned": 8},\n {"time": 35, "returned": 8},\n {"time": 70, "returned": 8},\n {"time": 105, "returned": 8},\n {"time": 140, "returned": 8},\n {"time": 175, "returned": 8}\n]\nExplanation: \nconst result = [];\nconst fn = (x) => x * 2;\nconst cancelTimeMs = 190;\n\nconst start = performance.now();\n\nconst log = (...argsArr) => {\n const diff = Math.floor(performance.now() - start);\n result.push({"time": diff, "returned": fn(...argsArr)});\n}\n\nconst cancel = cancellable(log, [4], 35);\nsetTimeout(cancel, cancelTimeMs);\n\nsetTimeout(() => {\n console.log(result); // Output\n }, cancelTimeMs + 50) \n\nEvery 35ms, fn(4) is called. Until t=190ms, then it is cancelled.\n1st fn call is at 0ms. fn(4) returns 8.\n2nd fn call is at 35ms. fn(4) returns 8.\n3rd fn call is at 70ms. fn(4) returns 8.\n4th fn call is at 105ms. fn(4) returns 8.\n5th fn call is at 140ms. fn(4) returns 8.\n6th fn call is at 175ms. fn(4) returns 8.\nCancelled at 190ms\n\n\n
Example 2:
\n\n\nInput: fn = (x1, x2) => (x1 * x2), args = [2, 5], t = 30\nOutput: \n[\n {"time": 0, "returned": 10},\n {"time": 30, "returned": 10},\n {"time": 60, "returned": 10},\n {"time": 90, "returned": 10},\n {"time": 120, "returned": 10},\n {"time": 150, "returned": 10}\n]\nExplanation: \nconst cancelTimeMs = 165;\n\nEvery 30ms, fn(2, 5) is called. Until t=165ms, then it is cancelled.\n1st fn call is at 0ms \n2nd fn call is at 30ms \n3rd fn call is at 60ms \n4th fn call is at 90ms \n5th fn call is at 120ms \n6th fn call is at 150ms\nCancelled at 165ms\n\n\n
Example 3:
\n\n\nInput: fn = (x1, x2, x3) => (x1 + x2 + x3), args = [5, 1, 3], t = 50\nOutput: \n[\n {"time": 0, "returned": 9},\n {"time": 50, "returned": 9},\n {"time": 100, "returned": 9},\n {"time": 150, "returned": 9}\n]\nExplanation: \nconst cancelTimeMs = 180;\n\nEvery 50ms, fn(5, 1, 3) is called. Until t=180ms, then it is cancelled. \n1st fn call is at 0ms\n2nd fn call is at 50ms\n3rd fn call is at 100ms\n4th fn call is at 150ms\nCancelled at 180ms\n\n\n
\n
Constraints:
\n\nfn
is a functionargs
is a valid JSON array1 <= args.length <= 10
30 <= t <= 100
10 <= cancelTimeMs <= 500
Node.js 16.13.2
.
Your code is run with --harmony
flag, enabling new ES6 features.
lodash.js library is included by default.
\\r\\n\\r\\nFor Priority Queue / Queue data structures, you may use 5.3.0 version of datastructures-js/priority-queue and 4.2.1 version of datastructures-js/queue.
\"], \"typescript\": [\"Typescript\", \"TypeScript 5.1.6, Node.js 16.13.2
.
Your code is run with --harmony
flag, enabling new ES2022 features.
lodash.js library is included by default.
\"]}", "libraryUrl": null, "adminUrl": null, "challengeQuestion": null, "__typename": "QuestionNode" } } }