如何處理現代JavaScript中的錯誤和承諾
始終使用.catch()處理承諾拒絕並防止未經手的拒絕。 2。使用async/等待嘗試/捕獲以進行可讀的錯誤處理,以確保在嘗試塊中等待所有承諾。 3。 。 4.在瀏覽器中使用“未置換拒絕”或在node.js中使用“未徵用”以進行調試,但始終明確處理拒絕。 5。使用Promise.All()所有承諾必須成功,並且Promise.allSettled()優雅地處理部分失敗。 6.拋出描述性的上下文錯誤,以改善調試和維護跨層的錯誤上下文。始終應用這些實踐可確保可靠,可維護的異步JavaScript代碼。
正確處理錯誤和承諾在現代JavaScript中至關重要,尤其是在使用異步操作(例如API呼叫,文件處理或計時器)時。如果無法正確管理,則被拒絕的拒絕或無聲失敗可能會導致難以追踪的錯誤。這是使用現代模式有效處理錯誤並有效承諾的方法。

1。使用.catch()
用於承諾拒絕處理
每當您與Promise合作時(無論是從fetch
返回, async
函數還是基於自定義的邏輯)始終使用.catch()
處理潛在的拒絕。
fetch('https://api.example.com/data') 。 。 .catch(錯誤=> { Console.Error(發生錯誤:',錯誤); });
即使您期望承諾能夠成功解決,網絡問題,CORS問題或畸形的JSON也會引起拒絕。跳過.catch()
風險可能會拒絕承諾,這可能會使您的應用在嚴格的環境中崩潰。

?提示:
.catch()
從鏈中的任何前一步都捕獲錯誤 - 無論是網絡故障,解析錯誤,甚至是.then()
回調中的異常。
2。使用async/await
try/catch
現代JavaScript偏愛async/await
語法,以清潔,更可讀的異步代碼。但是,使用這種樣式,您必須使用try/catch
塊來處理錯誤。

異步函數fetchdata(){ 嘗試 { const響應=等待提取('https://api.example.com/data'); const data =等待響應.json(); console.log(data); } catch(錯誤){ Console.Error('錯誤獲取數據:',錯誤); } }
這種方法反映了同步錯誤處理,並使調試更容易。 try
塊內部的任何被拒絕的承諾都會跳到catch
塊。
⚠️常見錯誤:忘記在
async
功能中的承諾await
。這不會立即拋出 - 它會返回被拒絕的承諾,可能繞開您的try/catch
。總是await
內部try
。
3。始終處理.then()
回調中的錯誤
即使在.then()
中,也可能發生錯誤 - 例如解析邏輯,無效的數據轉換或手動throw
語句。這些自動被承諾鏈捕獲,可以在下游處理。
fetch('/data.json') 然後(res => res.json()) 。然後(data => { 如果(!data.userid){ 投擲新錯誤(“缺少用戶ID”); } 返回數據; }) .catch(err => { Console.Error('驗證或解析失敗:',err); });
這意味著您不需要嵌套.catch()
try/catch
.then()
4。避免拒絕
當拒絕承諾時,會發生無人拒絕,但沒有.catch()
。現代瀏覽器和Node.js對這些記錄警告,未來版本可能會將其視為運行時錯誤。
全球監視未經處理的拒絕(用於開發或記錄):
在瀏覽器中:
window.addeventlistener('Unhandledledection',event => { console.warn('未經手的承諾拒絕:',event.reason); //可選地防止默認(抑制警告) });
在node.js中:
process.on('Unhandled Repoction',(原因,承諾)=> { Console.Error('未經拒絕的拒絕:',Promise,'原因:',原因); //日誌或發送到錯誤跟踪服務 });
?將其用於調試或監視,但不要依靠它作為您的主要錯誤處理。始終明確處理拒絕。
5。使用Promise.all()
和Promise.allSettled()
明智
處理多個承諾時:
-
Promise.all()
失敗了 - 一種拒絕會導致整個事情拒絕。 -
Promise.allSettled()
等待所有人完成,無論成功或失敗如何。
根據您的需求選擇:
//第一個錯誤失敗 嘗試 { const結果=等待承諾。 fetch('/api/user'), fetch('/api/posts'), ); } catch(錯誤){ //一個失敗的請求失敗了一切 }
//優雅地處理部分失敗 const結果=等待承諾。 fetch('/api/user'), fetch('/api/posts'), ); results.foreach((結果,索引)=> { if(result.status ==='earlield'){ console.log('成功:',result.value); } 別的 { Console.Error(“失敗:”,Result.Reason); } });
想要彈性時使用allSettled()
;當所有操作都必須成功時,請使用all()
。
6。拋出有意義的錯誤
而不是通用消息,而是提供上下文,以便調試更容易。
異步函數getuser(id){ 嘗試 { const res =等待提取(`/api/users/$ {id}`); 如果(!res.ok){ 投擲新錯誤(`http $ {res.status}:$ {res.statustext}`); } 返回等待res.json(); } catch(錯誤){ 投擲新錯誤(```無法獲得用戶$ {id}:$ {error.message}`); } }
這保留了出了問題和何處的鏈條。
基本上,乾淨的承諾錯誤處理歸結為一致性:始終處理拒絕,更喜歡async/await
try/catch
的可讀性,而永遠不要忽略失敗的可能性。它不是浮華的,但可以使您的應用程序保持穩定。
以上是如何處理現代JavaScript中的錯誤和承諾的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

Server-siderendering(SSR)inNext.jsgeneratesHTMLontheserverforeachrequest,improvingperformanceandSEO.1.SSRisidealfordynamiccontentthatchangesfrequently,suchasuserdashboards.2.ItusesgetServerSidePropstofetchdataperrequestandpassittothecomponent.3.UseSS

WebAssembly(WASM)isagame-changerforfront-enddevelopersseekinghigh-performancewebapplications.1.WASMisabinaryinstructionformatthatrunsatnear-nativespeed,enablinglanguageslikeRust,C ,andGotoexecuteinthebrowser.2.ItcomplementsJavaScriptratherthanreplac

事件委託是利用事件冒泡機制將子元素的事件處理交給父元素完成的技術。它通過在父元素上綁定監聽器,減少內存消耗並支持動態內容管理。具體步驟為:1.給父容器綁定事件監聽器;2.在回調函數中使用event.target判斷觸發事件的子元素;3.根據子元素執行相應邏輯。其優勢包括提升性能、簡化代碼維護和適應動態添加的元素。使用時需注意事件冒泡限制、避免過度集中監聽及合理選擇父級元素。

Zustandisalightweight,performantstatemanagementsolutionforReactappsthatavoidsRedux’sboilerplate;1.Useselectivestateslicingtopreventunnecessaryre-rendersbyselectingonlytheneededstateproperty;2.ApplycreateWithEqualityFnwithshalloworcustomequalitychecks

rel =“ stylesheet” linkscssfilesfilesforstylingthepage; 2.rel =“ pRELOAD” hintstopreloadcritical ricationResourcesourcesorforperformance; 3.rel =“ icon” setSthewebsite’sfavicon; 4.Rel =“ 4.REL =“ necter” selfertAltate's supportAlternate'sporlateRateSlikerSsorsSorsorSorprint; 5.ReL; 5.REL; 5.REL = REL =&QU&QU&QU&QU

ThetargetattributeinanHTMLanchortagspecifieswheretoopenthelinkeddocument.1._selfopensthelinkinthesametab(default).2._blankopensthelinkinanewtaborwindow.3._parentopensthelinkintheparentframe.4._topopensthelinkinthefullwindowbody,removingframes.Forexte

优化前端构建时间的核心在于减少冗余工作、提升处理效率、利用缓存及选择高效工具。1.合理使用TreeShaking和代码分割,确保按需引入并利用动态导入减少打包体积;2.减少不必要的Loader处理,排除node_modules,升级loader并放宽Babel转译范围;3.利用缓存机制加快重复构建,启用Webpack缓存、CI缓存并使用离线安装;4.升级工具链,如使用Vite、esbuild或Rollup提升构建速度,虽有迁移成本但效果显著。

使用OAuth2.0時應採用PKCE授權碼流程而非隱式流程,避免在前端存儲令牌於localStorage,優先通過後端處理刷新令牌,並利用可信認證庫實現安全集成,以確保前端應用的安全性。
