還真的第一次看到題目滿意度倒讚比讚多的…
Day14: Timeout Cancellation
問題描述:
Given a function fn, an array of arguments args, and a timeout t in milliseconds, return a cancel function cancelFn.
After a delay of t, fn should be called with args passed as parameters unless cancelFn was invoked before the delay of t milliseconds elapses, specifically at cancelT ms. In that case, fn should never be called.
問題難度:Easy
問題限制:
fnis a functionargsis a valid JSON array1 <= args.length <= 1020 <= t <= 100010 <= cancelT <= 1000
我的解題過程:
還真的第一次看到題目滿意度倒讚比讚多的….
但題目真的讓人看不太懂,題目應該是要我們當時間t秒後執行,但如果在t秒內被執行時,fn是不能執行的。
所以我們要設計一段確定時間超過後才能執行的setTimeout
先完成要執行的setTimeout:
1  | const timeout = setTimeout(() => {  | 
接下來就是執行之前side-project有做過的**clearTimeout():**
1  | const clearTime = clearTimeout(timeout)  | 
接下來就是問題了,要怎麼去使用它。
想了很久都想不到,只好去問Bard了
果然不愧是Bard,他回答了一行我認為很重要的:當 clearTimeout() 函數被呼叫時,它會立即取消指定的超時。如果超時已經觸發,則 clearTimeout() 函數將不起作用。
所以我可以直接回傳clearTime
因此
1  | const clearTime = clearTimeout(timeout)  | 
咦?出現錯誤:Error: Function ‘cancellable’ should return a function
原來是我這樣打回傳的會是一個值或是undefined,但是我要的是回傳一個function,
因此我要把它改成arrow function:
1  | const clearTime = () => clearTimeout(timeout)  | 
沒錯!這樣就完成了
完整答案
1  | var cancellable = function(fn, args, t) {  | 
其他解答
1  | const cancellable = function(fn, args, t) {  | 
跟我的答案差異只有一個,就是他把cancelFn移到最上面,以下是他的解釋:
定義「cancelFn」函數的主要目的是確保它可以在「cancellable」函數的範圍內訪問。這允許我們將「cancelFn」函數作為函數結果的一部分返回,使其可以在「cancellable」函數之外的其他地方使用。通常,最好在最上面定義函數。
結論
還好之前在做side-project時有做過clearTimeout()應此還有點印像,但當 clearTimeout() 函數被呼叫時,它會立即取消指定的超時。如果超時已經觸發,則 clearTimeout() 函數將不起作用。這個我就真的是這次才知道有這個功用。