{ "data": { "question": { "questionId": "2862", "questionFrontendId": "2725", "categoryTitle": "JavaScript", "boundTopicId": 2300584, "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
现给定一个函数 fn
,一个参数数组 args
和一个时间间隔 t
,返回一个取消函数 cancelFn
。
函数 fn
应该立即使用 args
调用,并且在每个 t
毫秒内再次调用,直到调用 cancelFn
。
\n\n
示例 1:
\n\n\n输入:fn = (x) => x * 2, args = [4], t = 35, cancelT = 190\n输出:\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]\n解释: \nconst result = []\nconst fn = (x) => x * 2\nconst args = [4], t = 35, cancelT = 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, 190);\n\nsetTimeout(() => {\n console.log(result) // Output\n }, cancelT + t + 15) \n\n每隔 35ms,调用 fn(4)。直到 t=190ms,然后取消。\n第一次调用 fn 是在 0ms。fn(4) 返回 8。\n第二次调用 fn 是在 35ms。fn(4) 返回 8。\n第三次调用 fn 是在 70ms。fn(4) 返回 8。\n第四次调用 fn 是在 105ms。fn(4) 返回 8。\n第五次调用 fn 是在 140ms。fn(4) 返回 8。\n第六次调用 fn 是在 175ms。fn(4) 返回 8。\n在 t=190ms 时取消\n\n\n
示例 2:
\n\n\n输入:fn = (x1, x2) => (x1 * x2), args = [2, 5], t = 30, cancelT = 165\n输出: \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]\n解释:\nconst cancel = cancellable((x1, x2) => (x1 * x2), [2, 5], 30); \nsetTimeout(cancel, 165);\n\n每隔 30ms,调用 fn(2, 5)。直到 t=165ms,然后取消。\n第一次调用 fn 是在 0ms\n第二次调用 fn 是在 30ms\n第三次调用 fn 是在 60ms\n第四次调用 fn 是在 90ms\n第五次调用 fn 是在 120ms\n第六次调用 fn 是在 150ms\n在 165ms 取消\n\n\n
示例 3:
\n\n\n输入:fn = (x1, x2, x3) => (x1 + x2 + x3), args = [5, 1, 3], t = 50, cancelT = 180\n输出:\n[\n {\"time\": 0, \"returned\": 9},\n {\"time\": 50, \"returned\": 9},\n {\"time\": 100, \"returned\": 9},\n {\"time\": 150, \"returned\": 9}\n]\n解释:\nconst cancel = cancellable((x1, x2, x3) => (x1 + x2 + x3), [5, 1, 3], 50);\nsetTimeout(cancel, cancelT);\n\n每隔 50ms,调用 fn(5, 1, 3)。直到 t=180ms,然后取消。\n第一次调用 fn 是在 0ms\n第二次调用 fn 是在 50ms\n第三次调用 fn 是在 100ms\n第四次调用 fn 是在 150ms\n在 180ms 取消\n\n\n
\n\n
提示:
\n\nfn
是一个函数args
是一个有效的 JSON 数组1 <= args.length <= 10
30 <= t <= 100
10 <= cancelT <= 500
\\u7248\\u672c\\uff1a \\u60a8\\u7684\\u4ee3\\u7801\\u5728\\u6267\\u884c\\u65f6\\u5c06\\u5e26\\u4e0a lodash.js<\\/a> \\u5e93\\u5df2\\u7ecf\\u9ed8\\u8ba4\\u88ab\\u5305\\u542b\\u3002<\\/p>\\r\\n\\r\\n \\u5982\\u9700\\u4f7f\\u7528\\u961f\\u5217\\/\\u4f18\\u5148\\u961f\\u5217\\uff0c\\u60a8\\u53ef\\u4f7f\\u7528 datastructures-js\\/priority-queue@5.3.0<\\/a> \\u548c datastructures-js\\/queue@4.2.1<\\/a>\\u3002<\\/p>\"],\"typescript\":[\"TypeScript\",\" TypeScript 5.1.6<\\/p>\\r\\n\\r\\n Compile Options: --alwaysStrict --strictBindCallApply --strictFunctionTypes --target ES2022<\\/p>\\r\\n\\r\\n lodash.js<\\/a> \\u5e93\\u5df2\\u7ecf\\u9ed8\\u8ba4\\u88ab\\u5305\\u542b\\u3002<\\/p>\\r\\n\\r\\n \\u5982\\u9700\\u4f7f\\u7528\\u961f\\u5217\\/\\u4f18\\u5148\\u961f\\u5217\\uff0c\\u60a8\\u53ef\\u4f7f\\u7528 datastructures-js\\/priority-queue@5.3.0<\\/a> \\u548c datastructures-js\\/queue@4.2.1<\\/a>\\u3002<\\/p>\"]}",
"book": null,
"isSubscribed": false,
"isDailyQuestion": false,
"dailyRecordStatus": null,
"editorType": "CKEDITOR",
"ugcQuestionId": null,
"style": "LEETCODE",
"exampleTestcases": "(x) => x * 2\n[4]\n35\n190\n(x1, x2) => (x1 * x2)\n[2,5]\n30\n165\n(x1, x2, x3) => (x1 + x2 + x3)\n[5,1,3]\n50\n180",
"__typename": "QuestionNode"
}
}
}Node.js 16.13.2<\\/code><\\/p>\\r\\n\\r\\n
--harmony<\\/code> \\u6807\\u8bb0\\u6765\\u5f00\\u542f \\u65b0\\u7248ES6\\u7279\\u6027<\\/a>\\u3002<\\/p>\\r\\n\\r\\n