尾奏

我知道這可能是一篇很長的文章,但相信您會喜歡它。無論如何,如果您有任何疑問或有任何建議,請隨時與我聯繫。

感謝您閱讀本文,再見?

","image":"http://www.luping.net/uploads/20240822/172428984466c6933405c14.gif","datePublished":"2024-08-22T09:24:04+08:00","dateModified":"2024-08-22T09:24:04+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 您不需要設定超時

您不需要設定超時

發佈於2024-08-22
瀏覽:564

我知道計時器已經成為許多人在日常任務中使用的功能已有一段時間了。在 JavaScript 世界中,計時器通常使用 setTimeout 或 setInterval 函數來實現,如果您這樣做的話,壞消息是這不是一個好的做法,我將嘗試解釋原因。

在我開始解釋我的想法之前,我有一個問題要問你:你能用手錶報錯時間嗎?

如果您的答案是肯定的,很抱歉浪費了您的寶貴時間,因為這篇文章不屬於您。

另一方面,如果您的答案是否定的,我將解釋為什麼使用 setTimeout 或 setInterval 就像使用損壞的手錶來獲取時間。

這些功能的問題

首先,讓我們考慮以下程式碼片段

 function test() {
   let i = 0;
   setTimeout(() => console.log("hello"), 0);
   while (i 


如果您在瀏覽器控制台中執行此程式碼片段,您將得到以下結果

You don

此行為是由於setTimeout 將回調添加到瀏覽器隊列中,以便在空閒時處理它(沒有任務要做) 換句話說,回調傳遞給setTimeout 的優先級較低

現在,知道了這一點,我認為您將很難使用 setTimeout 函數來實現計時器,因為您可以同時擁有 2 個甚至 10 個刻度(取決於您的瀏覽器的繁忙程度)。這對於調試來說將是一場噩夢,但是我們有更好的解決方案嗎?

避免這些功能的方法

為了提供更好的實作計時器的方法,我們應該使用requestAnimationFrame 函數,因為它告訴瀏覽器在下一次繪製之前執行回調(換句話說,在UI 發生任何更改之前)

這裡的差異非常微妙,所以最好透過程式碼來理解。讓我們收回先前的程式碼片段並稍微調整一下以比較 setTimeout 和 requestAnimationFrame

function testWithAnimationFrame() {
  let i = 0;
  setTimeout(() => console.log("hello"), 0);
  requestAnimationFrame(() => console.log("tell me the next paint"));
  while (i 


在此範例中,我們可以看到,在 Chrome 上運行時,setTimeout 在 requestAnimationFrame 之前運行 (儘管在極少數情況下會發生相反的情況)

You don

但如果你在 Firefox 上運行它,這將是輸出

You don

這看起來可能令人困惑,但如果你稍微注意一下,你會發現執行過程中沒有發生任何繪畫,因此如何處理這種情況取決於瀏覽器。

現在,如果我們可以調整程式碼片段以使瀏覽器重新繪製頁面,讓我們看看會發生什麼

function testWithAnimationFrame2() {
  let i = 0;
  setTimeout(() => console.log("hello"), 0);
  requestAnimationFrame(() => console.log("tell me the next paint"));
  while (i 


這是 Chrome 上的輸出

You don

這是 Firefox 中的輸出

You don

正如您在日誌中看到的,當瀏覽器在 UI 中進行更改時,requestAnimationFrame 函數將始終優先於其他計劃的回調。

因為在網路上,我們不斷地執行重繪,requestAnimationFrame 是實現計時器的明顯選擇。

了解 requestAnimationFrame 函數

此函數僅接受回呼作為參數。為了向回調提供上下文,它應該採用一個時間戳,指示基於頁面初始渲染時間的前一幀結束的時間。

該函數將傳回一個代表請求識別碼的整數,如果您希望使用cancelAnimationFrame函數取消請求,這會很有用。

JavaScript 中秒錶的簡單實現

要實現秒錶,有一些要求:

  • 我們應該知道它應該在多少時間後滴答(通常是一秒)
  • 我們應該知道秒錶停止計時的延遲時間
  • 滴答間隔應小於延遲

考慮到所有這些要求,以下程式碼片段將為您建立一個秒錶

尾奏

我知道這可能是一篇很長的文章,但相信您會喜歡它。無論如何,如果您有任何疑問或有任何建議,請隨時與我聯繫。

感謝您閱讀本文,再見?

版本聲明 本文轉載於:https://dev.to/jospinevans/you-dont-need-to-set-the-time-out-5bfo?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 從零到 Web 開發人員:掌握 PHP 基礎知識
    從零到 Web 開發人員:掌握 PHP 基礎知識
    掌握PHP基礎至關重要:安裝PHP建立PHP檔案運行程式碼理解變數和資料類型使用表達式和運算子建立實際專案以提高技能 PHP開發入門:掌握PHP基礎PHP是一種用途廣泛、功能強大的腳本語言,用於創建動態且互動式Web應用程式。對於初學者來說,掌握PHP的基本知識至關重要。 一、安裝PHP在本地開發機...
    程式設計 發佈於2024-11-05
  • 緩衝區:Node.js
    緩衝區:Node.js
    Node.js 中緩衝區的簡單指南 Node.js 中的 Buffer 用於處理原始二進位數據,這在處理流、文件或網路數據時非常有用。 如何建立緩衝區 來自字串: const buf = Buffer.from('Hello'); 分配特定大小的Buffer...
    程式設計 發佈於2024-11-05
  • 掌握 Node.js 中的版本管理
    掌握 Node.js 中的版本管理
    作為開發者,我們經常遇到需要不同 Node.js 版本的專案。對於可能不經常參與 Node.js 專案的新手和經驗豐富的開發人員來說,這種情況都是一個陷阱:確保每個專案使用正確的 Node.js 版本。 在安裝依賴項並執行專案之前,驗證您的 Node.js 版本是否符合或至少相容專案的要求至關重要...
    程式設計 發佈於2024-11-05
  • 如何在 Go 二進位檔案中嵌入 Git 修訂資訊以進行故障排除?
    如何在 Go 二進位檔案中嵌入 Git 修訂資訊以進行故障排除?
    確定Go 二進位檔案中的Git 修訂版部署程式碼時,將二進位檔案與建置它們的git 修訂版關聯起來會很有幫助排除故障的目的。然而,直接使用修訂號更新原始程式碼是不可行的,因為它會改變原始程式碼。 解決方案:利用建造標誌解決此挑戰的方法包括利用建造標誌。透過使用建置標誌在主套件中設定當前 git 修訂...
    程式設計 發佈於2024-11-05
  • 常見 HTML 標籤:視角
    常見 HTML 標籤:視角
    HTML(超文本標記語言)構成了 Web 開發的基礎,是互聯網上每個網頁的結構。透過了解最常見的 HTML 標籤及其高級用途,到 2024 年,開發人員可以創建更有效率、更易於存取且更具視覺吸引力的網頁。在這篇文章中,我們將探討這些 HTML 標籤及其最高級的用例,以協助您提升 Web 開發技能。 ...
    程式設計 發佈於2024-11-05
  • CSS 媒體查詢
    CSS 媒體查詢
    確保網站在各種裝置上無縫運作比以往任何時候都更加重要。隨著用戶透過桌上型電腦、筆記型電腦、平板電腦和智慧型手機造訪網站,響應式設計已成為必要。響應式設計的核心在於媒體查詢,這是一項強大的 CSS 功能,可讓開發人員根據使用者裝置的特徵應用不同的樣式。在本文中,我們將探討什麼是媒體查詢、它們如何運作以...
    程式設計 發佈於2024-11-05
  • 了解 JavaScript 中的提升:綜合指南
    了解 JavaScript 中的提升:綜合指南
    JavaScript 中的提升 提升是一種行為,其中變數和函數聲明在先前被移動(或「提升」)到其包含範圍(全域範圍或函數範圍)的頂部程式碼被執行。這意味著您可以在程式碼中實際聲明變數和函數之前使用它們。 變數提升 變數 用 var 宣告的變數被提升...
    程式設計 發佈於2024-11-05
  • 將 Stripe 整合到單一產品 Django Python 商店中
    將 Stripe 整合到單一產品 Django Python 商店中
    In the first part of this series, we created a Django online shop with htmx. In this second part, we'll handle orders using Stripe. What We'll...
    程式設計 發佈於2024-11-05
  • 在 Laravel 測試排隊作業的技巧
    在 Laravel 測試排隊作業的技巧
    使用 Laravel 應用程式時,經常會遇到命令需要執行昂貴任務的情況。為了避免阻塞主進程,您可能決定將任務卸載到可以由佇列處理的作業。 讓我們來看一個例子。想像一下指令 app:import-users 需要讀取一個大的 CSV 檔案並為每個條目建立一個使用者。該命令可能如下所示: /* Imp...
    程式設計 發佈於2024-11-05
  • 如何創建人類層級的自然語言理解 (NLU) 系統
    如何創建人類層級的自然語言理解 (NLU) 系統
    Scope: Creating an NLU system that fully understands and processes human languages in a wide range of contexts, from conversations to literature. ...
    程式設計 發佈於2024-11-05
  • 如何使用 JSTL 迭代 HashMap 中的 ArrayList?
    如何使用 JSTL 迭代 HashMap 中的 ArrayList?
    使用JSTL 迭代HashMap 中的ArrayList在Web 開發中,JSTL(JavaServer Pages 標準標記庫)提供了一組標記來簡化JSP 中的常見任務( Java 伺服器頁面)。其中一項任務是迭代資料結構。 要迭代 HashMap 及其中包含的 ArrayList,可以使用 JS...
    程式設計 發佈於2024-11-05
  • Encore.ts — 比 ElysiaJS 和 Hono 更快
    Encore.ts — 比 ElysiaJS 和 Hono 更快
    几个月前,我们发布了 Encore.ts — TypeScript 的开源后端框架。 由于已经有很多框架,我们想分享我们做出的一些不常见的设计决策以及它们如何带来卓越的性能数据。 性能基准 我们之前发布的基准测试显示 Encore.ts 比 Express 快 9 倍,比 Fasti...
    程式設計 發佈於2024-11-05
  • 為什麼使用 + 對字串文字進行字串連接失敗?
    為什麼使用 + 對字串文字進行字串連接失敗?
    連接字串文字與字串在 C 中,運算子可用於連接字串和字串文字。但是,此功能存在限制,可能會導致混亂。 在問題中,作者嘗試連接字串文字「Hello」、「,world」和「!」以兩種不同的方式。第一個例子:const string hello = "Hello"; const str...
    程式設計 發佈於2024-11-05
  • React 重新渲染:最佳效能的最佳實踐
    React 重新渲染:最佳效能的最佳實踐
    React高效率的渲染機制是其受歡迎的關鍵原因之一。然而,隨著應用程式複雜性的增加,管理元件重新渲染對於最佳化效能變得至關重要。讓我們探索優化 React 渲染行為並避免不必要的重新渲染的最佳實踐。 1. 使用 React.memo() 作為函數式元件 React.memo() 是...
    程式設計 發佈於2024-11-05
  • 如何實作條件列建立:探索 Pandas DataFrame 中的 If-Elif-Else?
    如何實作條件列建立:探索 Pandas DataFrame 中的 If-Elif-Else?
    Creating a Conditional Column: If-Elif-Else in Pandas給定的問題要求將新列新增至DataFrame 中基於一系列條件標準。挑戰在於在實現這些條件的同時保持程式碼效率和可讀性。 使用函數應用程式的解決方案一種方法涉及創建一個將每一行映射到所需結果的函...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3