欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

?javascript中Dima去除try-catch的方法是什么

本篇內(nèi)容主要講解“  javascript中Dima去除try-catch的方法是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“  javascript中Dima去除try-catch的方法是什么”吧!

創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為卓尼企業(yè)提供專業(yè)的網(wǎng)站設(shè)計、成都網(wǎng)站制作,卓尼網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

Dima 去除 try-catch 的方法

當然套路依舊,Dima 講到了回調(diào)地獄,Promise 鏈并最終引出了 async/await。而在處理錯誤的時候,他并不喜歡 try-catch  的方式,所以寫了一個 to(promise) 來對 Promise 進行封裝,輔以解構(gòu)語法,實現(xiàn)了同步寫法但類似 Node 錯誤標準的代碼。摘抄代碼如下

// to.js export default function to(promise) {     return promise         .then(data => {             return [null, data];         })         .catch(err => [err]); }

應(yīng)用示例:

import to from "./to.js";  async function asyncTask(cb) {     let err, user, savedTask;      [err, user] = await to(UserModel.findById(1));     if (!user) return cb("No user found");      [err, savedTask] = await to(TaskModel({ userId: user.id, name: "Demo Task" }));     if (err) return cb("Error occurred while saving task");      if (user.notificationsEnabled) {         const [err] = await to(NotificationService.sendNotification(user.id, "Task Created"));         if (err) return cb("Error while sending notification");     }      cb(null, savedTask); }

Dima 的辦法讓人產(chǎn)生的了熟悉的感覺,Node 的回調(diào)中不是經(jīng)常都這樣寫嗎?

(err, data) => {     if (err) {         // deal with error     } else {         // deal with data     } }

所以這個方法真的很有意思。不過回過頭來想一想,這段代碼中每當遇到錯誤,都是將錯誤消息通過 cb()  調(diào)用推出去,同時中斷后續(xù)過程。像這種中斷式的錯誤處理,其實正適合采用 try-catch。

使用 try-catch 改寫上面的代碼

要用 try-catch 改寫上面的代碼,首先要去掉 to() 封裝。這樣,一旦發(fā)生錯誤,需要使用 Promise.prototype.catch()  進行捕捉,或者使用 try-catch 對 await promise 語句進行捕捉。捕捉到的,當然是每個業(yè)務(wù)代碼里 reject 出來的 err。

然而注意,上面的代碼中并沒有直接使用 err,而是使用了自定義的錯誤消息。所以需要對 reject 出來的 err  進一步處理成指定的錯誤消息。當然這難不到誰,比如

someAsync().catch(err => Project.reject("specified message"));

然后再最外層加上 try-catch 就好。所以改寫之后的代碼是:

async function asyncTask(cb) {     try {         const user = await UserModel.findById(1)             .catch(err => Promise.reject("No user found"));          const savedTask = await TaskModel({ userId: user.id, name: "Demo Task" })             .catch(err => Promise.reject("Error occurred while saving task"));          if (user.notificationsEnabled) {             await NotificationService.sendNotification(user.id, "Task Created")                 .catch(err => Promise.reject("Error while sending notification"));         }          cb(null, savedTask);     } catch (err) {         cb(err);     } }

上面這段代碼,從代碼量上來說,并沒有比 Dima 的代碼減少了多少工作量,只是去掉了大量 if (err) {} 結(jié)構(gòu)。不習慣使用 try-catch  的程序員找找不到中斷點,但習慣了 try-catch 的程序員都知道,業(yè)務(wù)過程中一旦發(fā)生錯誤(異步代碼里指 reject),代碼就會跳到 catch 塊去處理  reject 出來的值。

但是,一般業(yè)務(wù)代碼 reject 出來的信息通常都是有用的。假如上面的每個業(yè)務(wù) reject 出來的 err 本身就是錯誤消息,那么,用 Dima  的模式,仍然需要寫

if (err) return cb(err);

而用 try-catch 的模式,就簡單多了

async function asyncTask(cb) {     try {         const user = await UserModel.findById(1);         const savedTask = await TaskModel({ userId: user.id, name: "Demo Task" });          if (user.notificationsEnabled) {             await NotificationService.sendNotification(user.id, "Task Created");         }          cb(null, savedTask);     } catch (err) {         cb(err);     } }

為什么?因為在 Dima 的模式中,if (err) 實際上處理了兩個業(yè)務(wù):一是捕捉會引起中斷的 err ,并將其轉(zhuǎn)換為錯誤消息,二是通過 return  中斷業(yè)務(wù)過程。所以當 err 轉(zhuǎn)換為錯誤消息這一過程不再需要的時候,這種捕捉中斷再重新引起中斷的處理主顯得多余了。

繼續(xù)改進

用函數(shù)表達式改善 try-catch 邏輯

當然還有改進的空間,比如 try {} 塊中的代碼比較長,會造成閱讀不太方便,try-catch  的邏輯有被“切斷”的感覺。這種情況下可以使用函數(shù)表達式來改善

async function asyncTask(cb) {     async function process() {         const user = await UserModel.findById(1);         const savedTask = await TaskModel({ userId: user.id, name: "Demo Task" });          if (user.notificationsEnabled) {             await NotificationService.sendNotification(user.id, "Task Created");         }         return savedTask;     }      try {         cb(null, await process());     } catch (err) {         cb(err);     } }

如果對錯誤的處理代碼比較長,也可以寫成單獨的函數(shù)表達式。

如果過程中每一步的錯誤處理邏輯不同怎么辦

如果發(fā)生錯誤,不再轉(zhuǎn)換為錯誤消息,而是特定的錯誤處理邏輯,怎么辦?

思考一下,我們用字符串來表示錯誤消息,以后可以通過 console.log()  來處理處理。而邏輯,最適合的表示當然是函數(shù)表達式,最終可以通過調(diào)用來進行統(tǒng)一處理

async function asyncTask(cb) {     async function process() {         const user = await UserModel.findById(1)             .catch(err => Promise.reject(() => {                 // deal with error on looking for the user                 return "No user found";             }));          const savedTask = await TaskModel({ userId: user.id, name: "Demo Task" })             .catch(err => Promise.reject(() => {                 // making model error                 // deal with it                 return err === 1                     ? "Error occurred while saving task"                     : "Error occurred while making model";             }));          if (user.notificationsEnabled) {             await NotificationService.sendNotification(user.id, "Task Created")                 .catch(err => Promise.reject(() => {                     // just print a message                     logger.log(err);                     return "Error while sending notification";                 }));         }          return savedTask;     }      try {         cb(null, await process());     } catch (func) {         cb(func());     } }

甚至還可以處理更復雜的情況

現(xiàn)在應(yīng)該都知道 .catch(err => Promise.reject(xx)),這里的 xx 就是 try-catch 的 catch  塊捕捉到的對象,所以如果不同的業(yè)務(wù) reject  出來不同的對象,比如有些是函數(shù)(表示錯誤處理邏輯),有些是字符串(表示錯誤消息),有些是數(shù)字(表示錯誤代碼)——其實只需要改 catch 塊就行

try {        // ...       } catch(something) {        switch (typeof something) {            case "string":                // show message something                break;            case "function":                something();                break;            case "number":                // look up something as code                // and show correlative message                break;            default:                // deal with unknown error        }    }

到此,相信大家對“  javascript中Dima去除try-catch的方法是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

當前名稱:?javascript中Dima去除try-catch的方法是什么
標題來源:http://aaarwkj.com/article28/jjjccp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站導航、微信小程序品牌網(wǎng)站制作、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
人妻天天爽夜夜爽欧美色| 欧美久久久久综合一区| 手机在线观看av大片| 日本熟女中文字幕一区| 免费人成在线观看网站免费观看 | 欧美亚洲另类麻豆综合在线| 日本在线有码中文视频| 久久96国产精品久久秘臀| 亚洲av天堂天天天堂色| 开裆丝袜高跟啪啪高潮av| 欧洲精品久久久久久| 伊人久久大香线蕉av色婷婷色| 国产伦奸在线播放免费| 亚洲av激情码国产一区| 周妍希浴室视频色哟哟| 色婷婷激情一区二区三区| 一区二区三区毛片视频| 国产激情在线四五区观看| 日本一二三四卡久久精品| 91狠狠综合久久精品| 成年人免费在线观看毛片| 日韩精品高清视频在线观看| 18禁的视频在线观看| 99热这里只有精品最新| 和富婆啪啪一区二区免费看| 国产伦精品二区三区视频| 亚洲精品国产精品粉嫩av| 热门精品一区二区三区| 亚洲一区二区精品999| 日本亚洲欧美男人的天堂| 国产青青草成人在线视频| 成人午夜黄色福利视频| 18禁超污网站免费观看| 精华国产一区二区三区| 国产情色自拍在线观看| 国产精品久久123区| 2020年国产97精品自拍| 国产精品熟女一区二区三区| 日韩中文字幕久久中文字幕| 好看的中文字幕人妻少妇| 久久精品有码视频免费观看|