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

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

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

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

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

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

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

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

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

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

我们的 catch 变成了一个不需要大括号的单行代码:ARa28资讯网——每日最新资讯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() 函数究竟是什么样子的呢?ARa28资讯网——每日最新资讯28at.com

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

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

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

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

TypeScript 在这样的情况下非常好用;我们看看一个泛型类型的 tryCatch() 可能是什么样子:ARa28资讯网——每日最新资讯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() :ARa28资讯网——每日最新资讯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 回调中返回的字符串。ARa28资讯网——每日最新资讯28at.com

异步处理

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

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

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

显然,在真实世界的应用程序中,请求将会是异步的,以避免阻塞用户界面线程:ARa28资讯网——每日最新资讯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 并且没有作用域错误地成功出来。ARa28资讯网——每日最新资讯28at.com

我们像以前一样进行重构,这次,我们 async 了 try 和 catch 函数,从而 await 了 tryCatch() :ARa28资讯网——每日最新资讯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 经验法则:ARa28资讯网——每日最新资讯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文件

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top