当前位置:首页 > 科技  > 软件

函数式 try-catch 如何转变 JavaScript 代码

来源: 责编: 时间:2024-06-25 17:20:11 245观看
导读这种情况有多常见?function writeTransactionsToFile(transactions) { let writeStatus; try { fs.writeFileSync('transactions.txt', transactions); writeStatus = 'success'; } catch (error) { write

这种情况有多常见?oQE28资讯网——每日最新资讯28at.com

function writeTransactionsToFile(transactions) {  let writeStatus;  try {    fs.writeFileSync('transactions.txt', transactions);    writeStatus = 'success';  } catch (error) {    writeStatus = 'error';  }    // do something with writeStatus...}

这是另一个我们想要一个取决于是否存在异常的值的实例。oQE28资讯网——每日最新资讯28at.com

通常, 我们可能会在 try-catch 的范围之外创建一个可变变量,以便在其中和之后无错误地访问。oQE28资讯网——每日最新资讯28at.com

但情况并非总是这样。只要有一个函数式的 try-catch 就不会这样。oQE28资讯网——每日最新资讯28at.com

一个纯粹的 tryCatch() 函数避免了可变变量,并在我们的代码库中鼓励可维护性和可预测性。oQE28资讯网——每日最新资讯28at.com

没有修改外部状态 - tryCatch() 封装了整个错误处理逻辑并产生单一输出。oQE28资讯网——每日最新资讯28at.com

我们的 catch 变成了一个不需要大括号的单行代码:oQE28资讯网——每日最新资讯28at.com

function writeTransactionsToFile(transactions) {  // 我们现在可以使用 const 了  const writeStatus = tryCatch({    tryFn: () => {      fs.writeFileSync('transactions.txt', transactions);      return 'success';    },    catchFn: (error) => 'error'  });  // do something with writeStatus...}

tryCatch() 函数

那么,这个 tryCatch() 函数究竟是什么样子的呢?oQE28资讯网——每日最新资讯28at.com

从我们以上的使用方式,你已经可以猜到定义了:oQE28资讯网——每日最新资讯28at.com

function tryCatch({ tryFn, catchFn }) {  try {    return tryFn();  } catch (error) {    return catchFn(error);  }}

为了正确地讲述函数的作用,我们确保使用对象参数来明确参数名称——即使只有两个属性。oQE28资讯网——每日最新资讯28at.com

因为编程不仅仅是达到目的的手段 - 我们还在讲述从开始到结束的代码库中的对象和数据的故事。oQE28资讯网——每日最新资讯28at.com

TypeScript 在这样的情况下非常好用;我们看看一个泛型类型的 tryCatch() 可能是什么样子:oQE28资讯网——每日最新资讯28at.com

type TryCatchProps<T> = {  tryFn: () => T;  catchFn: (error: any) => T;};function tryCatch<T>({ tryFn, catchFn }: TryCatchProps<T>): T {  try {    return tryFn();  } catch (error) {    return catchFn(error);  }}

我们用 TypeScript 重写功能性 writeTransactionsToFile() :oQE28资讯网——每日最新资讯28at.com

function writeTransactionsToFile(transactions: string) {  // 返回 'success' 或 'error'  const writeStatus = tryCatch<'success' | 'error'>({    tryFn: () => {      fs.writeFileSync('transaction.txt', transactions);      return 'success';    },    catchFn: (error) => return 'error';  });  // do something with writeStatus...}

我们使用 'success' | 'error' 联合类型来限制我们可以从 try 和 catch 回调中返回的字符串。oQE28资讯网——每日最新资讯28at.com

异步处理

不,我们完全不需要担心这个问题 - 如果 tryFn 或 catchFn 是 async ,那么 writeTransactionToFile() 会自动返回一个 Promise 。oQE28资讯网——每日最新资讯28at.com

这是我们大多数人应该熟悉的另一个 try-catch 情况:发出网络请求并处理错误。oQE28资讯网——每日最新资讯28at.com

在这里,我们根据请求是否成功来设置一个外部变量(在try-catch 之外)——在 React 应用中,我们可以轻松地用它设置状态。oQE28资讯网——每日最新资讯28at.com

显然,在真实世界的应用程序中,请求将会是异步的,以避免阻塞用户界面线程:oQE28资讯网——每日最新资讯28at.com

async function comment(comment: string) {  type Status = 'error' | 'success';  let commentStatus: Status;  try {    const response = await fetch('https://api.mywebsite.com/comments', {      method: 'POST',      headers: {        'Content-Type': 'application/json',      },      body: JSON.stringify({ comment }),    });    if (!response.ok) {      commentStatus = 'error';    } else {      commentStatus = 'success';    }  } catch (error) {    commentStatus = 'error';  }  // do something with commentStatus...}

我们再次需要在这里创建一个可变变量,以便它可以进入 try-catch 并且没有作用域错误地成功出来。oQE28资讯网——每日最新资讯28at.com

我们像以前一样进行重构,这次,我们 async 了 try 和 catch 函数,从而 await 了 tryCatch() :oQE28资讯网——每日最新资讯28at.com

async function comment(comment: string) {  type Status = 'error' | 'success';  // ⚠️ await because this returns Promise<Status>  const commentStatus = await tryCatch<Status>({    tryFn: async () => {      const response = await fetch('https://api.mywebsite.com/comments', {        method: 'POST',        headers: {          'Content-Type': 'application/json',        },        body: JSON.stringify({ comment }),      });      // ⚠️ functional conditional      return response.ok ? 'success' : 'error';    },    catchFn: async (error) => 'error',  });  // do something with commentStatus...}

可读性,模块化,和单一职责

处理异常时遵循的两个 try-catch 经验法则:oQE28资讯网——每日最新资讯28at.com

  • try-catch 应尽可能靠近错误的源头
  • 每个函数只使用一个 try-catch

他们将使你的代码在短期和长期内更易于阅读和维护。看看这里的 processJSONFile() 

本文链接:http://www.28at.com/showinfo-26-96430-0.html函数式 try-catch 如何转变 JavaScript 代码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: ICDE 2024 | 服务调用延迟降低10%-70%,字节跳动做了什么?

下一篇: .NET使用CsvHelper快速读取和写入CSV文件

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 电博会上海尔智家模拟500平大平层,还原生活空间沉浸式体验

    电博会为了更好地让参展观众真正感受到智能家居的绝妙之处,海尔智家的程传岭先生同样介绍了展会上海尔智家的模拟500平大平层,还原生活空间沉浸式体验。程传
Top