還真的第一次看到題目滿意度倒讚比讚多的…
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
問題限制:
fn
is a functionargs
is a valid JSON array1 <= args.length <= 10
20 <= t <= 1000
10 <= 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() 函數將不起作用。
這個我就真的是這次才知道有這個功用。