[TS LeetCode 筆記] 2637. Promise Time Limit

更新於 2024/10/10閱讀時間約 5 分鐘

原題目:

Given an asynchronous function fn and a time t in milliseconds, return a new time limited version of the input function. fn takes arguments provided to the time limited function.

The time limited function should follow these rules:

  • If the fn completes within the time limit of t milliseconds, the time limited function should resolve with the result.
  • If the execution of the fn exceeds the time limit, the time limited function should reject with the string "Time Limit Exceeded".

題目知識點:

  1. 異步編程概念: 考題要求理解和應用異步函數,這意味著你需要知道如何處理非同步操作,以確保代碼不會在等待操作完成時被阻塞。
  2. Promise 使用: 你需要了解 JavaScript 中的 Promise 如何工作,包括如何創建、解析、拒絕和處理 Promise。在這個題目中,你需要處理成功的 Promise 和被拒絕的 Promise。
  3. 計時器函數: 你需要了解 JavaScript 中的 setTimeoutclearTimeout 函數,以設定和取消計時器。這是用來確保異步操作在指定時間內完成的重要工具。
  4. 函數參數和引數: 題目要求你將一個函數 fn 以及時間限制 t 作為參數,然後使用這些參數來創建新的時間限制版本的函數。你需要了解如何在函數中處理這些引數。
  5. 錯誤處理: 這個題目要求你處理可能出現的錯誤,並返回指定的錯誤消息。你需要知道如何使用 try...catch 來處理可能的錯誤情況。

總結來說,這個題目主要測試你對異步編程、Promise、計時器函數和函數引數的理解和應用,以及你的錯誤處理能力。

先備知識:

  • setTimeout 和 clearTimeout: setTimeout 是 JavaScript 中的函數,它允許我們在一定的時間後執行指定的程式碼。clearTimeout 用於取消計時器。
  • Promise.race: Promise.race 是 Promise 的一個方法,它可以同時監控多個 Promise,並在其中任何一個 Promise 完成時返回該 Promise 的結果。

應用情境:

這段程式碼適用於網頁頁面開發中的各種場景,以下是一些實際例子:

  • 網頁請求超時控制: 在網頁應用程式中,當我們向伺服器發送網絡請求時,我們希望確保請求不會花費太長時間。這段程式碼可以用來設定一個時間限制,如果網絡請求在指定時間內未完成,它將立即返回一個錯誤,以確保用戶體驗不會受到阻礙。
  • 前端性能優化: 在前端開發中,我們常常需要執行一些計算或操作,以提高網頁性能。這段程式碼可用於設定最大執行時間,以確保這些操作不會對網頁的反應時間產生負面影響。
  • 遊戲開發: 在線遊戲或網頁遊戲中,我們可能需要控制特定遊戲事件的執行時間。使用這段程式碼,我們可以確保這些事件不會長時間阻塞遊戲的進行。

結論:

這段程式碼提供了一個有效的方法,用於在異步操作中添加時間限制,以確保它們不會花費過長的時間。它使用了 JavaScript 中的 Promise、setTimeout 函數和 Promise.race 方法,這些都是處理異步操作時的重要工具。當需要確保操作在合理時間內完成時,這段程式碼是一個有用的工具,它提高了應用程式的可靠性和用戶體驗。

解答

type Fn = (...params: any[]) => Promise<any>;

/**
 * @param {Function} fn
 * @param {number} t
 * @return {Function}
 */
function timeLimit(fn: Fn, t: number): Fn {
   
    return async function(...args) {
        let timer: ReturnType<typeof setTimeout>;
        const timePromise: Promise<void> = new Promise<void> ((_, reject) => {
            timer = setTimeout(() => reject('Time Limit Exceeded'), t);
        })
        try {
            const result = await Promise.race([fn(...args), timePromise]);
            return result;
        } finally {
            clearTimeout(timer);
        }
    }
};


avatar-img
2會員
8內容數
"TypeScript LeetCode" 以 TypeScript 為工具,深入解析 LeetCode 上的算法和資料結構問題,提供清晰解釋和程式碼示範,幫助您精進 TypeScript 技能,解決挑戰性問題,無論您的程式開發水平如何。讓我們一同鑽研、提升,迎接算法挑戰,成長技術專長!,快速提高您的技能水平
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
毛怪的沙龍 的其他內容
[Leetcode 筆記] TypeScript 2715. Timeout Cancellation 了解和有效使用 clearTimeout 和 setTimeout 可以提高JavaScript程序的效率和響應性。
分享今年29歲的我,離職之後開始探索自己的過程。
[Leetcode 筆記] TypeScript 2715. Timeout Cancellation 了解和有效使用 clearTimeout 和 setTimeout 可以提高JavaScript程序的效率和響應性。
分享今年29歲的我,離職之後開始探索自己的過程。
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
本章節主要介紹了JavaScript中的流程控制,包括條件語句(如if、else if、else和三元運算子)和循環結構(如for迴圈、while迴圈等)。同時,也提供了如何使用break、continue和label來控制迴圈的執行。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
什麼是 Promise.all? 在有多個 Promise 的時候,使用 Promise.all 可以確保「所有的 Promise 都執行完以後,才進入 then」。 Promise.all 語法結構: Promise.all 接受的參數是陣列形式。 什麼時候要使用 Promise.all?
※ Promise基本介紹 什麼是 Promise? Promise 是 JavaScript 的一個構造函式,用於創建表示非同步操作的物件實例。使用 new Promise() 時,你會創建一個包含非同步操作的實例,這個實例可以透過其繼承的方法如 then(), catch(), 和 fina
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
※ 迴圈控制的兩個指令:break(跳脫)、continue(繼續) break(跳脫):當遇到一個需要強制脫離迴圈的情境,使用break(跳脫)就會直接跳出迴圈。 continue(繼續):用於跳過迴圈目前的迭代,直接開始下一次迭代的執行。 造成無限迴圈的例子: 說明: 當 x 的值
Thumbnail
立即(調用)函式 (簡稱 IIFE,Immediately Invoked Function Expression) 是種在定義完可以馬上執行的函式表達式。
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
分享一個有趣的套件,名為 await-to-js。 可以讓 Promise 與 await 的寫法更簡潔。
Thumbnail
本章節主要介紹了JavaScript中的流程控制,包括條件語句(如if、else if、else和三元運算子)和循環結構(如for迴圈、while迴圈等)。同時,也提供了如何使用break、continue和label來控制迴圈的執行。
Thumbnail
簡要說明 JavaScript 的 Event Loop JavaScript 是單執行緒 (single-threaded) 語言,這意味著它一次只能執行一件事,因此所有函式都需要排隊等待執行,這被稱為同步 (synchronous)。在同步操作中,若函式過多或過於複雜,會導致程式阻塞 (blo
※ 非同步概念總複習 為什麼要使用 Promise? 在 JavaScript 開發中,處理非同步操作是常見需求,涉及如文件讀寫、數據庫查詢或網路請求等耗時任務。傳統的回調方式可能導致代碼結構混亂,稱為「回調地獄」,難以維護和理解。 Promise 是解決這問題的方法。它是一個物件(objec
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
什麼是 Promise.all? 在有多個 Promise 的時候,使用 Promise.all 可以確保「所有的 Promise 都執行完以後,才進入 then」。 Promise.all 語法結構: Promise.all 接受的參數是陣列形式。 什麼時候要使用 Promise.all?
※ Promise基本介紹 什麼是 Promise? Promise 是 JavaScript 的一個構造函式,用於創建表示非同步操作的物件實例。使用 new Promise() 時,你會創建一個包含非同步操作的實例,這個實例可以透過其繼承的方法如 then(), catch(), 和 fina
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
※ 迴圈控制的兩個指令:break(跳脫)、continue(繼續) break(跳脫):當遇到一個需要強制脫離迴圈的情境,使用break(跳脫)就會直接跳出迴圈。 continue(繼續):用於跳過迴圈目前的迭代,直接開始下一次迭代的執行。 造成無限迴圈的例子: 說明: 當 x 的值
Thumbnail
立即(調用)函式 (簡稱 IIFE,Immediately Invoked Function Expression) 是種在定義完可以馬上執行的函式表達式。