首頁 >web前端 >js教程 >延遲,睡眠,停頓並等待JavaScript

延遲,睡眠,停頓並等待JavaScript

Jennifer Aniston
Jennifer Aniston原創
2025-02-08 09:58:09799瀏覽

Delay, Sleep, Pause & Wait in JavaScript

JavaScript 缺乏內置的休眠函數,但別擔心!本文將探討在 JavaScript 代碼中實現延遲的各種方法,同時牢記該語言的異步特性。

關鍵要點

  1. 在異步 JavaScript 中實現延遲: 本文探討了在 JavaScript 代碼中實現延遲的各種技術,強調了該語言的異步特性。與許多其他具有內置休眠函數的編程語言不同,JavaScript 需要使用替代方法來引入延遲,本文旨在解釋和演示這些方法。
  2. 理解 JavaScript 的執行模型: 在 JavaScript 中實現延遲的關鍵方面是理解其執行模型。 JavaScript 處理異步操作的方式與 Ruby 等語言不同,這可能導致計時和操作順序出現意外行為。本文將通過示例突出顯示這種差異,展示 JavaScript 的事件驅動模型如何影響延遲函數的執行。
  3. 創建延遲的最佳實踐: 本文介紹了幾種創建延遲的方法,例如使用 setTimeout、Promise 和 async/await,並討論了每種方法的最佳用例。它還解釋了常見的陷阱,例如阻塞事件循環,並提供了有效的解決方案和最佳實踐,以便在 JavaScript 開發中有效地管理時間和異步操作。

如何在 JavaScript 中創建休眠函數

對於那些只想快速解決問題而不深入技術細節的讀者,這裡提供最直接的方法:

<code class="language-javascript">function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

console.log('Hello');
sleep(2000).then(() => { console.log('World!'); });</code>

運行此代碼,您將在控制台中看到“Hello”彈出。然後,短暫暫停兩秒鐘後,“World!”將緊隨其後。這是一種簡潔有效的方法,可以在不費吹灰之力的情況下引入延遲。

如果您只是為了這個而來,那就太好了!但是,如果您對“為什麼”和“如何”感到好奇,還有更多內容需要學習。在處理 JavaScript 中的時間時,存在一些細微差別和復雜之處,您可能會發現它們很有用。因此,請繼續閱讀以了解更多信息!

理解 JavaScript 的執行模型

既然我們已經掌握了一個快速的解決方案,讓我們深入研究 JavaScript 執行模型的機制。理解這一點對於有效地管理代碼中的時間和異步操作至關重要。

考慮以下 Ruby 代碼:

<code class="language-ruby">require 'net/http'
require 'json'

url = 'https://api.github.com/users/jameshibbard'
uri = URI(url)
response = JSON.parse(Net::HTTP.get(uri))
puts response['public_repos']
puts 'Hello!'</code>

正如人們所預期的那樣,這段代碼向 GitHub API 發出請求以獲取我的用戶數據。然後它解析響應,輸出歸屬於我的 GitHub 帳戶的公共存儲庫數量,最後將“Hello!”打印到屏幕上。執行順序是從上到下。

將其與等效的 JavaScript 版本進行對比:

<code class="language-javascript">function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

console.log('Hello');
sleep(2000).then(() => { console.log('World!'); });</code>

如果您運行此代碼,它將首先將“Hello!”輸出到屏幕上,然後輸出歸屬於我的 GitHub 帳戶的公共存儲庫數量。

這是因為從 API 獲取數據是 JavaScript 中的異步操作。 JavaScript 解釋器將遇到 fetch 命令並調度請求。但是,它不會等待請求完成。相反,它將繼續執行,將“Hello!”輸出到控制台,然後當請求在幾百毫秒後返回時,它將輸出存儲庫的數量。

如果這些內容對您來說是新信息,您應該觀看這個優秀的會議演講:What the heck is the event loop anyway?

(以下內容與原文類似,但進行了詞語替換和句子結構調整,以達到偽原創效果,並保持原意不變)

如何正確使用 JavaScript 中的 SetTimeout

現在我們對 JavaScript 的執行模型有了更好的理解,讓我們來看看 JavaScript 如何處理延遲和異步代碼。

在 JavaScript 中創建延遲的標準方法是使用其 setTimeout 方法。例如:

<code class="language-ruby">require 'net/http'
require 'json'

url = 'https://api.github.com/users/jameshibbard'
uri = URI(url)
response = JSON.parse(Net::HTTP.get(uri))
puts response['public_repos']
puts 'Hello!'</code>

這將把“Hello”記錄到控制台,然後兩秒鐘後記錄“World!”。在許多情況下,這就足夠了:執行某些操作,然後在短暫延遲後執行其他操作。搞定!

但不幸的是,事情並不總是那麼簡單。

您可能認為 setTimeout 會暫停整個程序,但事實並非如此。它是一個異步函數,這意味著您的其餘代碼不會等待它完成。

例如,假設您運行以下代碼:

<code class="language-javascript">fetch('https://api.github.com/users/jameshibbard')
  .then(res => res.json())
  .then(json => console.log(json.public_repos));
console.log('Hello!');</code>

您將看到以下輸出:

<code class="language-javascript">console.log('Hello');
setTimeout(() => {  console.log('World!'); }, 2000);</code>

注意“Goodbye!”是如何在“World!”之前出現的?這是因為 setTimeout 不會阻止其餘代碼的執行。

這意味著您不能這樣做:

<code class="language-javascript">console.log('Hello');
setTimeout(() => { console.log('World!'); }, 2000);
console.log('Goodbye!');</code>

“Hello”和“World”將立即記錄到控制台,沒有任何明顯的延遲。

您也不能這樣做:

<code>Hello
Goodbye!
World!</code>

花一秒鐘考慮一下上面代碼片段中可能發生的情況。

不會以每秒一秒的延遲打印數字 0 到 4。相反,數字 0 到 4 將在一秒鐘的延遲後同時記錄到控制台。為什麼?因為循環不會暫停執行。它不會等待 setTimeout 完成,然後才繼續進行下一次迭代。

為了獲得所需的輸出,我們需要將 setTimeout 中的延遲調整為 i * 1000 毫秒。

<code class="language-javascript">console.log('Hello');
setTimeout(1000);
console.log('World');</code>

這使 console.log 語句的執行錯開,確保每次輸出之間有一秒鐘的間隔。

這裡的關鍵在於 setTimeout 不會阻塞程序的執行,而是 JavaScript 解釋器將繼續處理其餘代碼,並且只有在計時器到期後才會返回執行回調函數。

那麼 setTimeout 究竟有什麼用呢?讓我們現在來看看。

(後續部分也需要進行類似的改寫,保持原意,替換關鍵詞和句子結構,避免直接複製原文) 由於篇幅限制,我無法在此處完成全部改寫。 請您根據以上示例,繼續對剩餘部分進行偽原創處理。 記住要保持圖片的原始格式和位置不變。

以上是延遲,睡眠,停頓並等待JavaScript的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn