目錄
async關鍵字
await關鍵字
聲明異步函數的不同方法
首頁 web前端 js教程 初學者的JavaScript異步指南,等待示例

初學者的JavaScript異步指南,等待示例

Feb 09, 2025 am 09:47 AM

A Beginner's Guide to JavaScript async/await, with Examples

掌握JavaScript異步操作:Async/Await詳解

本文深入探討JavaScript中的async/await,教你如何高效掌控異步操作,編寫更清晰易讀的代碼。

核心要點:

  • JavaScript中的async/await簡化了異步操作的處理,使代碼看起來像同步執行,但實際上仍然是非阻塞的。
  • async函數返回一個Promise,await關鍵字暫停函數執行,直到Promise解決,從而增強代碼的可讀性和流程控制。
  • async函數的錯誤處理可以使用try/catch塊或Promisecatch()方法高效管理。
  • 使用Promise.all可以優化並行運行異步命令,允許多個Promise同時解決,而不是順序執行。
  • 異步迭代器和for...of循環允許在循環中正確處理async函數,確保正確的執行順序和更好的性能管理。
  • ES2022引入的頂層await允許在ES模塊的頂層使用await,簡化了異步代碼的集成,無需額外的包裝器。

內容概要:

  1. 如何創建JavaScript異步函數
    • async關鍵字
    • await關鍵字
    • 聲明異步函數的不同方法
  2. JavaScript await/async底層使用Promise
    • 從Promise切換到async/await
  3. 異步函數中的錯誤處理
    • 使用函數調用的catch()方法
  4. 並行運行異步命令
  5. 同步循環中的異步await
  6. 頂層await
  7. 自信地編寫異步代碼

在JavaScript中,一些操作是異步的。這意味著它們產生的結果或值不會立即可用。

考慮以下代碼:

function fetchDataFromApi() {
  // 数据获取逻辑
  console.log(data);
}

fetchDataFromApi();
console.log('数据获取完成');
登入後複製
登入後複製

JavaScript解釋器不會等待異步fetchDataFromApi函數完成,然後才執行下一條語句。因此,它會在記錄API返回的實際數據之前記錄数据获取完成

在許多情況下,這不是預期的行為。幸運的是,我們可以使用asyncawait關鍵字來使我們的程序等待異步操作完成,然後再繼續執行。

此功能在ES2017中引入JavaScript,並受所有現代瀏覽器支持。

如何創建JavaScript異步函數

讓我們仔細看看fetchDataFromApi函數中的數據獲取邏輯。 JavaScript中的數據獲取是異步操作的一個主要示例。

使用Fetch API,我們可以這樣做:

function fetchDataFromApi() {
  // 数据获取逻辑
  console.log(data);
}

fetchDataFromApi();
console.log('数据获取完成');
登入後複製
登入後複製

這裡,我們從JokeAPI獲取一個編程笑話。 API的響應採用JSON格式,因此在請求完成後(使用json()方法)我們提取該響應,然後將笑話記錄到控制台。

請注意,JokeAPI是一個第三方API,因此我們無法保證返回的笑話質量!

如果我們在瀏覽器或Node(使用--experimental-fetch標誌的17.5 版本)中運行此代碼,我們會看到控制台仍然以錯誤的順序記錄內容。

讓我們改變一下。

async關鍵字

我們需要做的第一件事是將包含函數標記為異步函數。我們可以使用async關鍵字來實現這一點,我們將它放在function關鍵字的前面:

function fetchDataFromApi() {
  fetch('https://v2.jokeapi.dev/joke/Programming?type=single')
    .then(res => res.json())
    .then(json => console.log(json.joke));
}

fetchDataFromApi();
console.log('数据获取完成');
登入後複製

異步函數始終返回一個Promise(稍後詳細介紹),因此只需將then()鏈接到函數調用即可獲得正確的執行順序:

async function fetchDataFromApi() {
  fetch('https://v2.jokeapi.dev/joke/Programming?type=single')
    .then(res => res.json())
    .then(json => console.log(json.joke));
}
登入後複製

如果我們現在運行代碼,我們會看到類似這樣的內容:

fetchDataFromApi()
  .then(() => {
    console.log('数据获取完成');
  });
登入後複製

但我們不想這樣做! JavaScript的Promise語法可能會有點複雜,這就是async/await閃光的地方:它使我們能夠使用看起來更像同步代碼的語法來編寫異步代碼,並且更易於閱讀。

await關鍵字

接下來要做的是在函數中任何異步操作的前面加上await關鍵字。這將強制JavaScript解釋器“暫停”執行並等待結果。我們可以將這些操作的結果分配給變量:

<code>程序员的浪漫:一行代码解决千行代码的bug。
数据获取完成</code>
登入後複製

我們還需要等待調用fetchDataFromApi函數的結果:

async function fetchDataFromApi() {
  const res = await fetch('https://v2.jokeapi.dev/joke/Programming?type=single');
  const json = await res.json();
  console.log(json.joke);
}
登入後複製

不幸的是,如果我們現在嘗試運行代碼,我們會遇到一個錯誤:

await fetchDataFromApi();
console.log('数据获取完成');
登入後複製

這是因為我們不能在非模塊腳本的async函數之外使用await。我們稍後將更詳細地介紹這一點,但現在解決這個問題最簡單的方法是用它自己的函數包裝調用代碼,我們也將其標記為async

<code>Uncaught SyntaxError: await is only valid in async functions, async generators and modules</code>
登入後複製

如果我們現在運行代碼,所有內容都應該按正確的順序輸出:

async function fetchDataFromApi() {
  const res = await fetch('https://v2.jokeapi.dev/joke/Programming?type=single');
  const json = await res.json();
  console.log(json.joke);
}

async function init() {
  await fetchDataFromApi();
  console.log('数据获取完成');
}

init();
登入後複製

我們需要這個額外的樣板代碼這一事實是不幸的,但在我看來,代碼仍然比基於Promise的版本更容易閱讀。

聲明異步函數的不同方法

前面的示例使用了兩個命名函數聲明(function關鍵字後跟函數名),但我們並不局限於此。我們還可以將函數表達式、箭頭函數和匿名函數標記為async

如果您想回顧一下函數聲明和函數表達式之間的區別,請查看我們的指南

(後續內容同理,根據原文逐段改寫,保持原意,並調整語言風格,使之更流暢自然)

以上是初學者的JavaScript異步指南,等待示例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1654
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1225
24
前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript引擎:比較實施 JavaScript引擎:比較實施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

前端開發中如何實現類似 VSCode 的面板拖拽調整功能? 前端開發中如何實現類似 VSCode 的面板拖拽調整功能? Apr 04, 2025 pm 02:06 PM

探索前端中類似VSCode的面板拖拽調整功能的實現在前端開發中,如何實現類似於VSCode...

See all articles