iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >​ javascript中Dima去除try-catch的方法是什么
  • 442
分享到

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

2024-04-02 19:04:59 442人浏览 独家记忆
摘要

本篇内容主要讲解“  javascript中Dima去除try-catch的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“  ja

本篇内容主要讲解“  javascript中Dima去除try-catch的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“  javascript中Dima去除try-catch的方法是什么”吧!

Dima 去除 try-catch 的方法

当然套路依旧,Dima 讲到了回调地狱,Promise 链并最终引出了 async/await。而在处理错误的时候,他并不喜欢 try-catch  的方式,所以写了一个 to(promise) 来对 Promise 进行封装,辅以解构语法,实现了同步写法但类似 node 错误标准的代码。摘抄代码如下

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

应用示例:

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 的办法让人产生的了熟悉的感觉,Node 的回调中不是经常都这样写吗?

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

所以这个方法真的很有意思。不过回过头来想一想,这段代码中每当遇到错误,都是将错误消息通过 cb()  调用推出去,同时中断后续过程。像这种中断式的错误处理,其实正适合采用 try-catch。

使用 try-catch 改写上面的代码

要用 try-catch 改写上面的代码,首先要去掉 to() 封装。这样,一旦发生错误,需要使用 Promise.prototype.catch()  进行捕捉,或者使用 try-catch 对 await promise 语句进行捕捉。捕捉到的,当然是每个业务代码里 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) {} 结构。不习惯使用 try-catch  的程序员找找不到中断点,但习惯了 try-catch 的程序员都知道,业务过程中一旦发生错误(异步代码里指 reject),代码就会跳到 catch 块去处理  reject 出来的值。

但是,一般业务代码 reject 出来的信息通常都是有用的。假如上面的每个业务 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) 实际上处理了两个业务:一是捕捉会引起中断的 err ,并将其转换为错误消息,二是通过 return  中断业务过程。所以当 err 转换为错误消息这一过程不再需要的时候,这种捕捉中断再重新引起中断的处理主显得多余了。

继续改进

用函数表达式改善 try-catch 逻辑

当然还有改进的空间,比如 try {} 块中的代码比较长,会造成阅读不太方便,try-catch  的逻辑有被“切断”的感觉。这种情况下可以使用函数表达式来改善

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);     } }

如果对错误的处理代码比较长,也可以写成单独的函数表达式。

如果过程中每一步的错误处理逻辑不同怎么办

如果发生错误,不再转换为错误消息,而是特定的错误处理逻辑,怎么办?

思考一下,我们用字符串来表示错误消息,以后可以通过 console.log()  来处理处理。而逻辑,最适合的表示当然是函数表达式,最终可以通过调用来进行统一处理

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());     } }

甚至还可以处理更复杂的情况

现在应该都知道 .catch(err => Promise.reject(xx)),这里的 xx 就是 try-catch 的 catch  块捕捉到的对象,所以如果不同的业务 reject  出来不同的对象,比如有些是函数(表示错误处理逻辑),有些是字符串(表示错误消息),有些是数字(表示错误代码)——其实只需要改 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的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: ​ javascript中Dima去除try-catch的方法是什么

本文链接: https://www.lsjlt.com/news/85961.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ​ javascript中Dima去除try-catch的方法是什么
    本篇内容主要讲解“  javascript中Dima去除try-catch的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“  ja...
    99+
    2022-10-19
  • swift错误处理do catch try try!使用的方法是什么
    这篇“swift错误处理do catch try try!使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获...
    99+
    2023-07-05
  • php去除deprecated的方法是什么
    这篇文章主要讲解了“php去除deprecated的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php去除deprecated的方法是什么”吧!找到并打开“php/php.ini...
    99+
    2023-06-25
  • mysql去除括号的方法是什么
    在MySQL中,可以使用REPLACE函数来去除括号。以下是使用REPLACE函数去除括号的示例:```sqlSELECT ...
    99+
    2023-09-29
    mysql
  • Java的try、catch、finally语句中有return各类情况是什么
    本篇内容主要讲解“Java的try、catch、finally语句中有return各类情况是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的try、catch、finally语句中有...
    99+
    2023-06-16
  • redis去除连接数的方法是什么
    要去除Redis的连接数,可以使用以下方法之一:1. 使用`CLIENT KILL`命令:在Redis的命令行界面中,可以使用`CL...
    99+
    2023-08-30
    redis
  • javascript除法取整的方法是什么
    这篇文章主要讲解了“javascript除法取整的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript除法取整的方法是什么”吧! ...
    99+
    2022-10-19
  • python去除重复数据的方法是什么
    Python中去除重复数据的方法有多种,下面是其中两种常见的方法:1. 使用集合(set)去除重复数据:将数据转换为集合类型,集合具...
    99+
    2023-08-09
    python
  • access查询去除重复项的方法是什么
    在Access中,可以使用DISTINCT关键字或GROUP BY子句来去除重复项。1. 使用DISTINCT关键字:在SELEC&...
    99+
    2023-10-11
    access
  • javascript清除数组的方法是什么
    这篇文章主要介绍javascript清除数组的方法是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript清除数组的方法:1、使用splice方法,代码为【ary.splice(0,ary.lengt...
    99+
    2023-06-14
  • javascript消除闭包的方法是什么
    本篇内容主要讲解“javascript消除闭包的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript消除闭包的方法是什么”吧!说明闭包中的一个关键问题是函数内的函数可以被...
    99+
    2023-06-20
  • javascript失去焦点的事件方法是什么
    本篇内容主要讲解“javascript失去焦点的事件方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript失去焦点的事件方法是什么”吧!在...
    99+
    2022-10-19
  • JavaScript数组去重的五种方法是什么
    本篇内容介绍了“JavaScript数组去重的五种方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-19
  • JavaScript删除延时器的方法是什么
    这篇文章主要讲解了“JavaScript删除延时器的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript删除延时器的方法是什么”吧!...
    99+
    2022-10-19
  • php数据库去除重复数据的方法是什么
    本篇内容介绍了“php数据库去除重复数据的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php数据库去除重复数据的方法:1、打开相...
    99+
    2023-06-25
  • sql中去重查询的方法是什么
    在SQL中,可以使用DISTINCT关键字来进行去重查询。DISTINCT关键字用于删除SELECT语句返回结果中重复的行。...
    99+
    2023-09-16
    sql
  • javascript利用set进行数组去重的方法是什么
    这篇文章主要介绍“javascript利用set进行数组去重的方法是什么”,在日常操作中,相信很多人在javascript利用set进行数组去重的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2022-10-19
  • python一组数据去除掉异常数据的方法是什么
    在Python中,可以使用以下方法来去除一组数据中的异常数据:1. 使用条件语句过滤数据:通过设置条件语句来判断数据是否异常,然后将...
    99+
    2023-09-23
    python
  • python set()去重的方法是什么
    这篇文章主要介绍了python set()去重的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python set()去重的方法是什么文章都会有所收获,下面我们一起来看看吧。set...
    99+
    2023-06-26
  • javascript删除指定覆盖物方法是什么
    这篇文章主要讲解了“javascript删除指定覆盖物方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript删除指定覆盖物方法是什么”...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作