目錄
1。使用.catch()用於承諾拒絕處理
2。使用async/await try/catch
3。始終處理.then()回調中的錯誤
4。避免拒絕
5。使用Promise.all()Promise.allSettled()明智
6。拋出有意義的錯誤
首頁 web前端 前端問答 如何處理現代JavaScript中的錯誤和承諾

如何處理現代JavaScript中的錯誤和承諾

Jul 29, 2025 am 12:15 AM

始終使用.catch()處理承諾拒絕並防止未經手的拒絕。 2。使用async/等待嘗試/捕獲以進行可讀的錯誤處理,以確保在嘗試塊中等待所有承諾。 3。 。 4.在瀏覽器中使用“未置換拒絕”或在node.js中使用“未徵用”以進行調試,但始終明確處理拒絕。 5。使用Promise.All()所有承諾必須成功,並且Promise.allSettled()優雅地處理部分失敗。 6.拋出描述性的上下文錯誤,以改善調試和維護跨層的錯誤上下文。始終應用這些實踐可確保可靠,可維護的異步JavaScript代碼。

如何處理現代JavaScript中的錯誤和承諾

正確處理錯誤和承諾在現代JavaScript中至關重要,尤其是在使用異步操作(例如API呼叫,文件處理或計時器)時。如果無法正確管理,則被拒絕的拒絕或無聲失敗可能會導致難以追踪的錯誤。這是使用現代模式有效處理錯誤並有效承諾的方法。

如何處理現代JavaScript中的錯誤和承諾

1。使用.catch()用於承諾拒絕處理

每當您與Promise合作時(無論是從fetch返回, async函數還是基於自定義的邏輯)始終使用.catch()處理潛在的拒絕。

 fetch('https://api.example.com/data')
  。
  。
  .catch(錯誤=> {
    Console.Error(發生錯誤:',錯誤);
  });

即使您期望承諾能夠成功解決,網絡問題,CORS問題或畸形的JSON也會引起拒絕。跳過.catch()風險可能會拒絕承諾,這可能會使您的應用在嚴格的環境中崩潰。

如何處理現代JavaScript中的錯誤和承諾

?提示: .catch()從鏈中的任何前一步都捕獲錯誤 - 無論是網絡故障,解析錯誤,甚至是.then()回調中的異常。


2。使用async/await try/catch

現代JavaScript偏愛async/await語法,以清潔,更可讀的異步代碼。但是,使用這種樣式,您必須使用try/catch塊來處理錯誤。

如何處理現代JavaScript中的錯誤和承諾
異步函數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中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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)

熱門話題

PHP教程
1535
276
使用Next.js解釋的服務器端渲染 使用Next.js解釋的服務器端渲染 Jul 23, 2025 am 01:39 AM

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

深入研究前端開發人員的WebAssembly(WASM) 深入研究前端開發人員的WebAssembly(WASM) Jul 27, 2025 am 12:32 AM

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

了解JavaScript事件委託模式 了解JavaScript事件委託模式 Jul 21, 2025 am 03:46 AM

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

Zustand的績效優先管理 Zustand的績效優先管理 Jul 25, 2025 am 04:32 AM

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

HTML中鏈接標籤中rel屬性的目的是什麼? HTML中鏈接標籤中rel屬性的目的是什麼? Aug 03, 2025 pm 04:50 PM

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

HTML中錨標籤的目標屬性的目的是什麼? HTML中錨標籤的目標屬性的目的是什麼? Aug 02, 2025 pm 02:23 PM

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

前端構建時間優化 前端構建時間優化 Jul 23, 2025 am 03:37 AM

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

在前端了解和實施OAuth 2.0 在前端了解和實施OAuth 2.0 Jul 25, 2025 am 04:31 AM

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

See all articles