Jeff的隨手筆記

學習當一個前端工程師

0%

用LeetCode寫日記-Day14

還真的第一次看到題目滿意度倒讚比讚多的…

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 tfn 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 function
  • args is a valid JSON array
  • 1 <= args.length <= 10
  • 20 <= t <= 1000
  • 10 <= cancelT <= 1000

我的解題過程:

還真的第一次看到題目滿意度倒讚比讚多的….

但題目真的讓人看不太懂,題目應該是要我們當時間t秒後執行,但如果在t秒內被執行時,fn是不能執行的。

所以我們要設計一段確定時間超過後才能執行的setTimeout

先完成要執行的setTimeout:

1
2
3
const timeout = setTimeout(() => {
fn(...args)
}, t)

接下來就是執行之前side-project有做過的**clearTimeout():**

1
const clearTime = clearTimeout(timeout)

接下來就是問題了,要怎麼去使用它。

想了很久都想不到,只好去問Bard了

果然不愧是Bard,他回答了一行我認為很重要的:
當 clearTimeout() 函數被呼叫時,它會立即取消指定的超時。如果超時已經觸發,則 clearTimeout() 函數將不起作用。

所以我可以直接回傳clearTime

因此

1
2
const clearTime = clearTimeout(timeout)
return clearTime

咦?出現錯誤:Error: Function ‘cancellable’ should return a function

原來是我這樣打回傳的會是一個值或是undefined,但是我要的是回傳一個function,

因此我要把它改成arrow function:

1
2
const clearTime = () => clearTimeout(timeout)
return clearTime

沒錯!這樣就完成了

完整答案

1
2
3
4
5
6
7
8
var cancellable = function(fn, args, t) {
const timeout = setTimeout(() => {
fn(...args)
}, t)

const clearTime = () => clearTimeout(timeout)
return clearTime
};

其他解答

1
2
3
4
5
6
7
8
9
10
const cancellable = function(fn, args, t) {
// cancelFn function//
const cancelFn = function (){
clearTimeout(timer);
};
const timer = setTimeout(()=>{
fn(...args)
}, t);
return cancelFn ;
};

跟我的答案差異只有一個,就是他把cancelFn移到最上面,以下是他的解釋:
定義「cancelFn」函數的主要目的是確保它可以在「cancellable」函數的範圍內訪問。這允許我們將「cancelFn」函數作為函數結果的一部分返回,使其可以在「cancellable」函數之外的其他地方使用。通常,最好在最上面定義函數。

結論

還好之前在做side-project時有做過clearTimeout()應此還有點印像,但當 clearTimeout() 函數被呼叫時,它會立即取消指定的超時。如果超時已經觸發,則 clearTimeout() 函數將不起作用。這個我就真的是這次才知道有這個功用。