前端異步任務處理總結

一、異步任務常見場景

  1. 網絡請求fetch()axios?等 API 調用

  2. 定時操作setTimeoutsetInterval

  3. 用戶交互:事件監聽回調

  4. 資源加載:圖片/腳本動態加載

  5. Web Workers:后臺線程計算

二、核心處理方案

1. Promise(ES6+)
function fetchUser(id) {return new Promise((resolve, reject) => {fetch(`/api/users/${id}`).then(response => response.json()).then(resolve).catch(reject)})
}// 使用示例
fetchUser(123).then(user => console.log(user)).catch(error => console.error(error))
2. async/await(ES2017+)
async function getUserData() {try {const user = await fetchUser(123)const posts = await fetchPosts(user.id)return { user, posts }} catch (error) {console.error('數據獲取失敗:', error)return null}
}// 調用
getUserData().then(console.log)
3. Promise 組合方法
方法特點使用場景
Promise.all()全部成功才返回,短路失敗強依賴的并行請求
Promise.allSettled()等待所有完成,返回狀態詳情獨立任務的結果收集
Promise.race()返回第一個完成的結果請求超時控制
Promise.any()返回第一個成功的結果多源數據擇優

Promise.allSettled() 示例

const promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 1');}, 1000);
});const promise2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 2');}, 2000);
});const promise3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 3');}, 3000);
});Promise.allSettled([promise1, promise2, promise3]).then(results => {  results.forEach(result => {  if(result.status === 'fulfilled') {  console.log('成功獲取值:', result.value);  } else {  console.error('拒絕原因:', result.reason);  }  });  });

三、高級處理模式

1. 請求競速(race)
function withTimeout(promise, timeout) {return Promise.race([promise,new Promise((_, reject) => setTimeout(() => reject(new Error('請求超時')), timeout))])
}// 使用
withTimeout(fetch('/api/data'), 5000).catch(error => console.error(error))
2. 順序執行 + 并行組合
async function processOrder(orderId) {// 順序執行const order = await fetchOrder(orderId)const user = await fetchUser(order.userId)// 并行執行const [product, address] = await Promise.all([fetchProduct(order.productId),fetchAddress(user.addressId)])return { order, user, product, address }
}
3. 錯誤重試機制
async function retry(fn, retries = 3, delay = 1000) {try {return await fn()} catch (err) {if (retries <= 0) throw errawait new Promise(res => setTimeout(res, delay))return retry(fn, retries - 1, delay * 2) // 指數退避}
}// 使用
retry(() => fetch('/unstable-api'))

四、實際應用技巧

加載狀態管理

async function loadData() {setLoading(true)try {const data = await fetchData()setState(data)} catch (error) {setError(error.message)} finally {setLoading(false)}
}

并發控制(避免同時發起過多請求):

async function parallelWithLimit(tasks, limit) {const results = []const executing = []for (const task of tasks) {const p = task().then(res => {executing.splice(executing.indexOf(p), 1)return res})results.push(p)executing.push(p)if (executing.length >= limit) {await Promise.race(executing)}}return Promise.all(results)
}// 使用:最多同時3個請求
parallelWithLimit([task1, task2, ...task10], 3)

五、最佳實踐

  1. 始終捕獲錯誤:使用?try/catch?或?.catch()

  2. 避免嵌套地獄:優先使用 async/await 替代回調嵌套

  3. 合理使用并行:獨立任務用?Promise.all()?或?Promise.allSettled()

  4. 添加取消機制:對長時間操作提供取消支持

  5. 性能優化

    • 請求合并(GraphQL/BFF)

    • 數據緩存(SWR/React Query)

    • 懶加載非關鍵資源

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

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

相關文章

機器學習第三課之邏輯回歸(二)LogisticRegression

目錄 簡介 一.分類評估?法 1.混淆矩陣 2.精確率(Precision)與召回率(Recall) 3.F1-score 4.分類評估報告api 2.正則化懲罰 3.?擬合和過擬合 4.K折交叉驗證 5.代碼分析 簡介 接上一篇博客最后 機器學習第二課之邏輯回歸&#xff08;一&#xff09;LogisticRegres…

基于ELK Stack的實時日志分析與智能告警實踐指南

基于ELK Stack的實時日志分析與智能告警實踐指南 一、業務場景描述 在生產環境中&#xff0c;服務實例數量眾多&#xff0c;日志量激增&#xff0c;傳統的文本 grep 或 SSH 登錄方式已無法滿足實時監控與故障定位需求。我們需要搭建一個可擴展、低延遲的日志收集與分析平臺&…

需求變更過程中出現的團隊資源沖突問題處理的一些小技巧

??一、資源沖突的典型場景?? ??技術資源爭奪??:多個需求同時需要同一開發人員或技術專家支持 ??人力資源過載??:突發需求導致團隊成員工作量超負荷(如同時處理3個緊急需求) ??設備/環境沖突??:測試服務器資源不足或特定開發工具許可證被占用 ??跨團隊協…

基于Matlab圖像處理的液晶顯示器表面缺陷檢測與分類研究

本課題設計并實現了一種基于 MATLAB 的圖像缺陷檢測系統&#xff0c;系統集成中值濾波、對比度增強、梯度檢測與區域分析等圖像處理技術&#xff0c;能夠對圖像中的點狀、線狀和塊狀缺陷進行有效識別與分類。用戶可通過圖形用戶界面&#xff08;GUI&#xff09;導入待測圖像&am…

prometheus應用demo(一)接口監控

目錄 完整代碼&#xff08;純Cursor生成&#xff09; 1、pom 2、配置和啟動類 3、自定義指標bean 4、上報 5、業務代碼 一、統計API請求&#xff08;次數、響應碼等&#xff09; 1、統計總數 關鍵代碼&#xff1a; &#xff08;1&#xff09;自定義指標DTO &#xff0…

逃離智能家居“孤島”!用 Home Assistant 打造你的全屋互聯自由王國

文章目錄&#x1f914; 痛點暴擊&#xff1a;智能家居的“巴別塔困境”&#x1f6e0;? Home Assistant 是個啥&#xff1f;簡單粗暴版定義&#x1f50d; 硬核拆解&#xff1a;Home Assistant 的魅力之源&#x1f680; 上車指南&#xff1a;如何開始你的 HA 之旅&#xff1f;第…

數據結構:如何判斷一個鏈表中是否存在環(Check for LOOP in Linked List)

目錄 初始思考&#xff1a;什么叫“鏈表有環”&#xff1f; ? 第一種直接想法&#xff08;失敗&#xff09;&#xff1a;我們是不是能“記住走過的節點”&#xff1f; 那我們換一個思路&#xff1a;我們能否只用兩個指針來檢測環&#xff1f; 第一步&#xff1a;定義兩個指…

深入理解Java的SPI機制,使用auto-service庫優化SPI

文章目錄一、簡介二、使用1、服務提供者&#xff08;或者第三方公共&#xff09;&#xff1a;定義接口2、服務提供者&#xff1a;定義實現類3、服務提供者&#xff1a;注冊服務4、構建服務提供者jar包5、客戶端&#xff1a;使用 ServiceLoader 來加載服務三、源碼分析1、源碼2、…

PPT自動化 python-pptx - 10 : 表格(tables)

在日常工作中&#xff0c;我們經常需要制作包含表格的 PowerPoint 演示文稿&#xff0c;以此清晰展示數據或文本信息。手動制作不僅耗時&#xff0c;當數據更新時還需重復操作&#xff0c;效率低下。而 python-pptx 庫為我們提供了自動化操作 PowerPoint 表格的可能。本文將詳細…

在安卓中使用 FFmpegKit 剪切視頻并添加文字水印

在安卓中用到的三方庫&#xff1a;https://github.com/arthenica/ffmpeg-kit 這個庫很強大&#xff0c;支持很多平臺&#xff0c;每個平臺都有各自的分支代碼&#xff0c;用了一段時間&#xff0c;穩定性挺好的&#xff0c; 找到安卓下的分支&#xff1a;FFmpegKit for Andro…

Flask + HTML 項目開發思路

Flask HTML 項目開發思路&#xff1a;以公共資源交易信息展示為例 一、開篇明義——為什么選 Flask 框架 在眾多 Python Web 框架&#xff08;如 Django、Tornado 等&#xff09;里&#xff0c;本次項目堅定選擇 Flask&#xff0c;背后有清晰的技術考量&#xff1a; 1. 輕量…

Vue中:deep()和 ::v-deep選擇器的區別

在 Vue.js 中&#xff0c;:deep()和 ::v-deep都是用于穿透組件作用域的深度選擇器&#xff0c;但它們在語法、適用場景和版本支持上存在區別。以下是兩者的核心差異&#xff1a;一、??語法與用法? &#xff1a;Vue2中用 ::v-deep&#xff0c;Vue2中不支持:deep()&#xff0c…

Deep learning based descriptor

1、DH3D: Deep Hierarchical 3D Descriptors for Robust Large-Scale 6DoF Relocalization 論文鏈接 代碼鏈接 這是一篇訓練點云的文章&#xff0c;在訓練出local descriptor之后&#xff0c;通過聚類的方法得出global descriptor&#xff0c;并且提出了hierarchical network&…

PandasAI連接LLM對MySQL數據庫進行數據分析

1. 引言 在之前的文章《PandasAI連接LLM進行智能數據分析》中實現了使用PandasAI連接與DeepSeek模型通過自然語言進行數據分析。不過那個例子中使用的是PandasAI 2.X&#xff0c;并且使用的是本地.csv文件來作為數據。在實際應用的系統中&#xff0c;使用.csv作為庫表的情況比…

FloodFill算法——DFS

FloodFill算法就是用來尋找性質相同的連通快的算法&#xff0c;這篇博客都是用dfs來實現FloodFill算法 1.圖像渲染 題目鏈接&#xff1a;733. 圖像渲染 - 力扣&#xff08;LeetCode&#xff09; 題目解析&#xff1a;將和&#xff08;sr,sc&#xff09;相連的所有像素相同的…

【BUUCTF系列】[極客大挑戰 2019]LoveSQL 1

本文僅用于技術研究&#xff0c;禁止用于非法用途。 Author:枷鎖 文章目錄一、題目核心漏洞分析二、關鍵解題步驟與技術解析1. 確定列數&#xff08;ORDER BY&#xff09;2. 聯合查詢獲取表名3. 爆破字段名4. 提取Flag三、漏洞根源與防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI時代,童裝銷售的“指路明燈”

別看現在AI、大數據這些詞眼花繚亂的&#xff0c;當年我剛入行那會兒&#xff0c;也跟你一樣&#xff0c;對著一堆庫存和銷量數據發愁&#xff0c;不知道勁兒該往哪使。童裝銷售這行&#xff0c;看著簡單&#xff0c;其實水挺深。不過呢&#xff0c;這二十多年摸爬滾打下來&…

Swin-Transformer從淺入深詳解

第一部分&#xff1a;出現背景在 Swin Transformer 出現之前&#xff0c;計算機視覺&#xff08;Computer Vision, CV&#xff09;領域主要由 CNN (卷積神經網絡) 主導。后來&#xff0c;NLP&#xff08;自然語言處理&#xff09;領域的 Transformer 模型被引入 CV&#xff0c;…

如何手動打包 Linux(麒麟系統)的 Qt 程序

gcc版本 gcc版本確保目標系統&#xff08;運行環境&#xff09;的 GCC 版本 高于或等于開發環境的版本&#xff0c;否則程序無法在目標平臺運行。通過 gcc -v 可查看當前版本。cmake生成可執行文件 強烈建議在cmakelists添加設置運行時 rpath 為 $ORIGIN/…/lib&#xff08;相對…

解決 “crypto.hash is not a function”:Vite 從 6.x 升級至 7.x 后 `pnpm run dev` 報錯問題

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 倉庫主頁&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 歡迎點贊 &#x1f44d; 收藏 ?評論 …