JavaScript異步編程:理解和使用Promise、Async/Await

JavaScript是一種單線程語言,這意味著它一次只能執行一個任務。然而,在Web開發中,我們經常需要處理異步操作,例如網絡請求、定時器、事件監聽等。JavaScript提供了多種方式來處理異步編程,包括回調函數、Promise、Async/Await等。

回調函數

回調函數是最基本的異步編程方式。當一個異步任務完成時,它會調用一個回調函數。這種方式的問題是回調地獄,即回調函數嵌套過多,難以理解和維護。

function asyncTask(callback) {setTimeout(() => {callback('Async task completed');}, 1000);
}asyncTask((result) => {console.log(result);
});

?

Promise

Promise是ES6引入的一種異步編程解決方案。它是一個對象,代表了一個異步操作的最終完成(或失敗)及其結果值。

let promise = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise resolved');}, 1000);
});promise.then((result) => {console.log(result);
}).catch((error) => {console.log(error);
});

Promise有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。Promise對象的狀態一旦改變,就不會再變,任何時候都可以得到這個結果。

?

Async/Await

Async/Await是ES7引入的一種新的異步編程解決方案,它是基于Promise的。Async/Await使得異步代碼看起來像同步代碼,更易于理解和維護。

async function asyncTask() {return new Promise((resolve, reject) => {setTimeout(() => {resolve('Async task completed');}, 1000);});
}async function run() {let result = await asyncTask();console.log(result);
}run();

Async函數返回一個Promise對象,可以使用then方法添加回調函數。Await表達式會暫停async函數的執行,等待Promise的解決,然后恢復async函數的執行并返回解決值。

?

錯誤處理

在異步編程中,錯誤處理是一個重要的問題。Promise提供了catch方法來捕獲錯誤,Async/Await可以使用try/catch來捕獲錯誤。

async function asyncTask() {throw new Error('Async task error');
}async function run() {try {let result = await asyncTask();console.log(result);} catch (error) {console.log(error);}
}run();

并發和并行

Promise.all和Promise.race可以用來處理并發和并行任務。

let promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 1 resolved');}, 1000);
});let promise2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 2 resolved');}, 2000);
});Promise.all([promise1, promise2]).then((results) => {console.log(results);
});Promise.race([promise1, promise2]).then((result) => {console.log(result);
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14976.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14976.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么生信流程語言讓你極度爽?

生信流程搭建有多難?行業為解決這一問題提出了各種各樣的配方,有你熟悉的嗎? 一、困境 - 亂 無數機構投入大量人力物力,以期獲得一條條可用的生信流程。而有些流程,由于種種原因,存在著巨大的缺陷&#xf…

安全風險 - 切換后臺時背景模糊處理

因為安全風險中提到當app處于后臺卡片狀態時,顯示的卡片頁面應該為模糊效果,否則容易泄露用戶隱私,尤其當前頁涉及個人信息、資產信息等,都會造成信息泄露!基于這種場景,我研究了下這種業務下的模糊效果 找…

普通函數的參數中的auto

2.1 普通函數的參數中的auto 從c14起&#xff0c;lambda可以使用auto占位符聲明或者定義參數: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 內部的操作&…

【OS】AUTOSAR Os是如何啟動第一個Task的

目錄 前言 正文 1.總體概覽及背景介紹 1.1. Os默認的Hook配置 1.2 用戶Task的配置

Golang創建文件夾

方法 package zdpgo_fileimport ("os" )// AddDir 創建文件夾 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }測試 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽 儀表盤所有提交榜單 I. 孤星 單點時限: 2.0 sec 內存限制: 512 MB &#x1d45b;(1≤103) 個干員&#xff0c;每個干員工資為 &#x1d464;&#x1d456;(1≤&#x1d464;&#x1d456;≤105)&#xff0c;貢獻…

JAVA云HIS醫院系統源碼 HIS源碼:云HIS系統與SaaS的關系

云HIS系統與SaaS的關系 云HIS系統是一種基于云計算技術的醫院信息系統&#xff0c;它采用B/S架構&#xff0c;通過云端SaaS服務的方式提供。用戶可以通過瀏覽器訪問云HIS系統&#xff0c;無需關注系統的部署、維護、升級等問題。云HIS系統通常具有模板化、配置化、智能化等特點…

react記錄部署

導語 React中的核心概念 1 虛擬DOM&#xff08;Virtual DOM&#xff09; 2 Diff算法&#xff08;虛擬DOM的加速器&#xff0c;提升React性能的法寶&#xff09; React主要的原理 Virtual DOM 虛擬DOM; 提供了一種不同的而又強大的方式來更新DOM&#xff0c; 代替直接的DOM操…

cuda11.8安裝torch2.0.1

pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118

hot100 -- 回溯(上)

目錄 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;電話號碼的字母組合 AC DFS &#x1f33c;組合總和 AC DFS &#x1f35e;科普 忘記 dfs 的&#xff0c;先看看這個&#x1f447; DFS&#xff08;深度優先搜索&#xf…

百度軟件測試面試經歷,期望薪資27K

一面 1、 請為百度搜索框設計測試用例&#xff1f; 2、百度設計框上線前需要進行那些測試&#xff1f; 界面測試&#xff0c;功能測試&#xff0c;性能測試&#xff0c;安全性測試&#xff0c;易用性測試&#xff0c;兼容性測試&#xff0c;UI測試。 3、如何查看http狀態碼…

重學java 38.創建線程的方式?

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一種方式_繼承extends Thread方法 1.定義一個類,繼承Thread 2.重寫run方法,在run方法中設置線程任務(所謂的線程任務指的是此線程要干的具體的事兒,具體執行的代碼) 3.創建自定義線程…

基于灰狼優化算法優化支持向量機(GWO-SVM)回歸預測

代碼原理 基于灰狼優化算法優化支持向量機&#xff08;GWO-SVM&#xff09;的回歸預測代碼的原理和流程如下&#xff1a; 1. **初始化灰狼群體**&#xff1a;隨機生成一定數量的灰狼&#xff0c;并初始化它們的位置和速度。 2. **初始化SVM模型參數**&#xff1a;根據問題要…

【JAVA基礎之網絡編程】UDP和TCP協議以及三次握手和四次揮手的過程

&#x1f525;作者主頁&#xff1a;小林同學的學習筆錄 &#x1f525;mysql專欄&#xff1a;小林同學的專欄 目錄 1. 網絡編程 1.1 概述 1.2 網絡編程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和協議 1.3 UDP協議 1.3.1 UDP發送數據 1.3.2 UDP接收數據 1.4…

C語言——小知識和小細節18

一、力扣題目 1、題目本體 2、題解 本題目我們使用異或分組的方法來解決。可以在我之前的文章《C語言——操作符CSDN博客》中看一下異或的特點。 由于異或的運算規則為相同為0&#xff0c;不同為1&#xff0c;而且是在二進制補碼上進行操作的&#xff0c;我們可以發現的一個…

c++|多態

c|多態 1 多態的概念2 多態的定義及其實現2.1 滿足多態的條件2.2 虛函數2.3 虛函數的重寫2.4 析構函數適合加virtural嗎2.4 C11 override 和 final2.5 三個概念的對比 3 多態的原理4 抽象類4.1 概念4.2 純虛函數 1 多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…

JS 手寫 節流throttle 防抖debounce函數

防抖debounce // 手寫防抖 function debounce(fn, delay 200) {// timer 在閉包中let timer null// 返回一個函數return function(...args) {if (timer) {clearTimeout(timer) // 清空上次的值}timer setTimeout(() > {fn.apply(this, args) // 透傳 this 和函數參數},…

【再探】設計模式—代理模式

代理是指授權代理人在一定范圍內代表其向第三方進行處理有關事務。 1 代理模式 需求&#xff1a;1&#xff09;將業務代碼與非業務代碼分離&#xff0c;在不改變代碼結構的基礎上&#xff0c;為其添加新的功能。2&#xff09;為系統中的某些操作做同一處理&#xff0c;例如進…

[實例] Unity Shader 逐像素漫反射與半蘭伯特光照

漫反射光照是Unity中最基本最簡單的光照模型&#xff0c;本篇將會介紹在片元著色器中實現反射效果&#xff0c;并會采用半蘭伯特光照技術對其進行改進。 1. 逐頂點光照與逐像素光照 在Unity Shader中&#xff0c;我們可以有兩個地方可以用來計算光照&#xff1a;在頂點著色器…