【js】Promise.try VS try-catch

前言

JavaScript 正為 Promise 添加一個新的方法,使得處理異步函數更加清晰和安全。Promise.try 允許將任何函數包裝在 Promise 中,無論它是否異步。

使用 Promise.try 可避免傳統 try/catch 結構與 Promise 鏈的混合使用,代碼更簡潔。

try-catch的問題

try-catch?主要用于同步代碼塊,它可以捕獲在?try?塊中拋出的同步錯誤。

try?{// 同步代碼throw?new?Error("Sync error");}?catch?(e) {console.error(e.message);?// 捕獲到錯誤}

但對于在?try?塊中調用了異步操作(如?setTimeout、Promise?等),那么異步操作中的錯誤不會被同一?try-catch?語句捕獲,因為它們是在事件循環的下一個周期中執行的。

try/catch?實際上是多余的,因為異步操作中的錯誤不會被?try/catch?捕獲。

function asyncFunction() {return new Promise((resolve,reject)=>{try{setTimeout(()=>{throw new Error(“Async error”);},1000)}catch(e){console.error(e.message)//捕獲不到錯誤reject(e);}})}

這使得在處理異步操作時,我們不得不在每個可能拋出錯誤的地方都添加?try-catch?塊,這不僅增加了代碼的復雜度,而且容易導致錯誤的遺漏:

function?asyncFunction() {return?new?Promise((resolve, reject) =>?{try?{setTimeout(() =>?{try?{throw?new?Error("Async error");}?catch?(e) {console.error('FedJavaScript', e.message);?// 捕獲到錯誤reject(e)}},?1000);}?catch?(e) {console.error(e.message);?// 不會捕獲到錯誤reject(e);}});}

Promise.try解決方案

Promise.try?為我們提供了一種處理該情況的簡潔方法:

示例:


Promise.try(() => {return maybeSyncOrAsyncOperation();
}).then(result => {console.log('結果:', result);
}).catch(error => {console.error('出錯了:', error);
});

同步和異步解決方案

Promise.try(()=>{//同步代碼throw?new?Error("sync error");}).catch(e=>{console.error(e.message);})Promise.try(()=>{//異步代碼return new Promise((resolve, reject) =>?{setTimeout(() =>?{throw?new?Error("Async error");},?1000);});}).catch(e=>{console.error(e.message);//捕獲到錯誤})

主要功能

  1. ?統一處理異常?:無論函數是同步還是異步,Promise.try 都能自動捕獲異常并返回錯誤信息。 ?
  2. ?支持參數傳遞?:可接受多個參數,方便調用復雜函數。 ?
  3. ?語法簡潔?:使用?.then()?和?.catch()?鏈式處理結果和錯誤,代碼更清晰。

使用場景

  1. ?文件操作?:如讀取文件時捕獲異常(如?JSON.parse(fs.readFileSync('./user.json')))。 ??
  2. ?網絡請求?:處理 HTTP 請求失敗。 ??
  3. ?數據流處理?:在數據解析或轉換過程中捕獲錯誤。 ??


優點

  1. 簡潔性:Promise.try?讓我們可以直接在一個函數中處理同步操作,而無需額外的?new Promise?包裝或?try...catch?塊
  2. 一致性:無論是同步還是異步操作,使用相同的錯誤處理機制可以減少代碼風格的不一致,使整個項目更加統一
  3. 易用性:對于初學者來說,理解?Promise.try?比學習如何正確地組合?new Promise?和?try...catch?更加直觀

總結

Promise.try允許我們在使用 Promises 時以更一致的方式處理異步操作的錯誤。

Promise.try 可將任何函數(同步、異步或可能拋出異常的)包裝為 Promise,自動捕獲同步異常并轉化為 Promise 狀態。無需區分函數類型,統一處理異常邏輯,避免隱藏錯誤。

Promise.try 執行函數時不會強制轉換為異步,同步函數會立即執行,異步函數則保持原有執行方式。

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

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

相關文章

MySQL-表的約束(上)

表的約束在 MySQL 中,表的約束(Constraints)用于確保數據庫中數據的完整性和一致性。它們定義了對表中數據的規則和限制,防止無效或不一致的數據被插入、更新或刪除。常見的 MySQL 表約束包括主鍵約束(PRIMARY KEY&…

Frida + FART 聯手:解鎖更強大的 Android 脫殼新姿勢

版權歸作者所有,如有轉發,請注明文章出處:https://cyrus-studio.github.io/blog/ Frida FART 聯手能帶來什么提升? 增強 FART 的脫殼能力:解決對抗 FART 的殼、動態加載的 dex 的 dump 和修復; 控制 FART…

TLS/SSL(傳輸層安全協議)

文章目錄一、核心概念二、為什么需要 TLS/SSL?三、工作原理與詳細流程握手步驟詳解:1.ClientHello & ServerHello:2.服務器認證 (Certificate, ServerKeyExchange):3.客戶端響應 (ClientKeyExchange, Finished):4.…

什么是 AWS 和 GCE ?

AWS 和 GCE 是兩種不同廠商提供的云計算服務,主要區別在于提供商和產品定位。AWS全稱:Amazon Web Services提供商:亞馬遜 (Amazon)簡介:全球最大的云計算平臺之一,提供完整的云服務,包括: 計算&…

水電站電動機絕緣安全 “不掉線”!在線監測方案筑牢發電保障

對水電站而言,消防水泵、深井水泵等輔助電動機是安全運行的 “關鍵配角”—— 它們常年處于備用狀態,又受潮濕環境影響,絕緣值降低易引發燒毀故障,而傳統定期檢測難以及時捕捉絕緣劣化趨勢,一旦啟動時出問題&#xff0…

【Datawhale之Happy-LLM】3種常見的decoder-only模型——Github最火大模型原理與實踐教程task07

Task07:第三章 預訓練語言模型PLM (這是筆者自己的學習記錄,僅供參考,原始學習鏈接,愿 LLM 越來越好?) 本篇介紹3種很典的decoder-only的PLM(GPT、LlaMA、GLM)。目前火&#x1f52…

【卷積神經網絡】卷積神經網絡的三大核心優勢:稀疏交互、參數共享與等變表示

1. 引言 卷積神經網絡(CNN)之所以在計算機視覺、語音識別等領域取得突破性進展,并非偶然。相比傳統的全連接神經網絡,CNN通過三個重要的思想來幫助改進機器學習系統:稀疏交互(sparse interactions)、參數共享(parameter sharing)、等變表示(equivariant representations)。…

網絡共享協議

網絡共享協議是用于在計算機網絡中實現資源共享和數據傳輸的規則或標準。常見的共享協議包括文件共享、打印機共享、互聯網連接共享等。SMB(Server Message Block 服務器消息塊)SMB是一種網絡共享協議,主要用于局域網中實現不同設備之間的文件…

MD5加密算法詳解與實現

MD5加密算法詳解與實現 什么是MD5加密? MD5(Message-Digest Algorithm 5)是一種廣泛使用的密碼散列函數,可以產生一個128位(16字節)的哈希值,通常用32位的十六進制數表示。MD5由Ronald Rivest在…

(nice!!!)(LeetCode 每日一題) 3025. 人員站位的方案數 I (排序)

題目:3025. 人員站位的方案數 I 思路:排序,時間復雜度0(n^2)。 將數組points里的元素先按橫坐標x升序排序,縱坐標y降序排序。第一層for循環枚舉左上角的點,第二層for循環枚舉右下角的點。細節看注釋。 C版本&#xff…

可可圖片編輯 HarmonyOS(4)圖片裁剪

可可圖片編輯 HarmonyOS(4)圖片裁剪-canvas 前言 可可圖片編輯 實現了圖片的裁剪功能,效果如圖所示。這里的核心技術是使用了canvas。 Canvas 入門 Canvas提供畫布組件,用于自定義繪制圖形,開發者使用CanvasRenderi…

怎么用PS制作1寸證件照(已解決)

方法/步驟一、按住鍵盤上的“Ctrl”“O”打開你要制作的照片二、點擊裁剪工具 (調整為寬:2.5cm,高:3.5cm,分辨率:300像素),設置之后直接框選出需要剪切保留的位置(使人物居正中), 然后按上面的“√”,以便確認剪裁三、…

Qt libcurl的下載、配置及簡單測試 (windows環境)

Qt libcurl的下載、配置及簡單測試引言一、libcurl下載二、在Qt Creator中配置三、簡單測試引言 curl(Client URL)是一個開源的命令行工具和庫,用于傳輸數據支持多種協議(如HTTP、HTTPS、FTP、SFTP等)。其核心庫libcur…

【Python語法基礎學習筆記】競賽常用標準庫

前言此系列筆記是撥珠自己的學習筆記,自用為主,學習建議移步其他大佬的專門教程。math庫Python 的 math 庫是標準庫之一,提供了大量數學運算相關的函數,適用于基礎數學計算、科學計算等場景。下面詳細介紹其使用方法及常用功能&am…

我的項目我做主:Focalboard+cpolar讓團隊協作擺脫平臺依賴

文章目錄前言1. 使用Docker本地部署Focalboard1.1 在Windows中安裝 Docker1.2 使用Docker部署Focalboard2. 安裝Cpolar內網穿透工具3. 實現公網訪問Focalboard4. 固定Focalboard公網地址前言 “項目管理軟件又漲價了!“小團隊負責人小林發愁——剛習慣操作邏輯&…

【3D 入門-4】trimesh 極速上手之 3D Mesh 數據結構解析(Vertices / Faces)

【3D入門-指標篇上】3D 網格重建評估指標詳解與通俗比喻【3D入門-指標篇下】 3D重建評估指標對比-附實現代碼【3D 入門-3】常見 3D 格式對比,.glb / .obj / .stl / .ply Mesh 數據結構解析 1. Vertices(頂點) original_vertices mesh_ful…

無需服務器,免費、快捷的一鍵部署前端 vue React代碼--PinMe

作為前端的開發,有時候想部署一個項目真的是很“受氣”,要不就是找運維,或者后端,看別人的時間,或者走流程。 現在,有這么一個神器PinMe, 以前部署項目:自己買服務器?域名、 SSL、N…

【LeetCode_26】刪除有序數組中的重復項

刷爆LeetCode系列LeetCode26題:github地址前言題目描述題目與思路分析代碼實現算法代碼優化LeetCode26題: github地址 有夢想的電信狗 前言 本文介紹用C實現leetCode第26題題目鏈接:https://leetcode-cn.com/problems/remove-duplicates-…

CMake構建學習筆記23-SQLite庫的構建

1. 構建思路 在前文中構建了大量的庫包程序(參看CMake構建學習筆記-目錄)之后,可以總結一下在Windows下使用腳本構建程序的辦法: 使用CMake構建。這是目前最通用最流行的構建方式,大部分C/C程序都在逐漸向這個方向轉…

Watt Toolkit下載安裝并加速GitHub

一、下載 官方地址:(Steam++官網) - Watt Toolkit Gitee下載地址:https://gitee.com/rmbgame/SteamTools/releases/tag/3.0.0-rc.16