首页 > 编程语言 > 异步请求返回处理之finally的用途,代码规范摸索【玩转JavaScript】

异步请求返回处理之finally的用途,代码规范摸索【玩转JavaScript】

时间:2023-08-06 22:33:13浏览次数:37  
标签:语句 异步 return res JavaScript try finally catch

前言

最近在改动老代码时,发现了一个有趣的现象。对于异步请求返回结果处理中,使用finally做兜底处理,不同的页面并不统一,也就是有的页面使用了,有的页面没使用,没使用的页面增加了额外的失败的处理。

所以finally到底要不要统一?

本着代码规范化原则的思维,我准备一探究竟。

文章速度

 异步请求返回处理之finally的用途,代码规范摸索【玩转JavaScript】_数据

finally 听说好用?

编程欢乐小剧场

某:来吧,是时候做个决定了。

一:我不知道怎么回答,多说的讯息。

某:我们的异步请求,到底用不用 finally?让我们来统一下。

一:好问题啊,赞。

某:所以?

一:统一的思维,确实符合规范化编程的思想,但是。

某:我就知道有转折。

一:过度的统一,会让代码缺失灵活性。

某:鱼与熊掌不可兼得。

一:好文采。

某:......

一:其实,应该用逆向思维思考这个问题,是不是存在不能使用finally的场景存在。

某:原来如此。

try...catch and finally

finally 块中的语句会在 try 块和 catch 之后执行。这里有两个而且。

  • 无论是否抛出异常,finally 块中的语句都会执行。
  • 如果抛出异常,即便没有 catch 处理异常,finally 块中的语句也会执行。
try {
  await request({ url: `http://localhost:${server.address().port}` });
} finally {
  server.close();
}

如上,server 都会执行关闭操作。

正向思维

借 finally 的特质合并「按钮防重&&数据重置」功能

现实项目中,新增/编辑数据的弹窗,是不可重复提交的,且提交之后,无论提交成功与否,表单数据需要置空(实际情况可能比举例中更复杂一些)。

通常,我们的功能处理如下:

http(params)
  .then(() => {
    message.success('操作成功');
  })
  .finally(() => {
    // 重置数据
    setData({});
    // 设置按钮不可点击
    setConfirmLoading(false);
  });

既然 finally 块中的语句也会执行,便可以把 try...catch 中相同的处理,提炼到 finally 块中,可减少重复的设置。

逆向思维

如果 try 语句中有 return,finally 依旧会执行吗?

function func() {
  try {
    return 'try';
  } finally {
    return 'finally';
  }
}
let res = func();
console.log('res:', res);

打印结果

// > res: finally

通过打印结果,不难发现,try 语句中有 return,finally 块中的语句依旧是执行了的。我们因此又得到一条规则:

如果 finally块 语句中返回一个值,那么这个值将会成为整个 try-catch-finally 的返回值。

为什么这么说呢,等我改造一下上面的代码:

function func() {
  try {
    console.log(1);
    return 'try';
  } catch (e) {
    console.log(2);
  } finally {
    console.log(3);
    return 'finally';
  }
}
let res = func();
console.log('res:', res);

打印结果

// > 1
// > 3
// > res: finally

再看现在的打印结果,try 语句中是执行的,只不过,finally 中的 return「覆盖了」try 中的 return。

总结

来说一下实验的结论:

  • 无论是否抛出异常,无论有没有 catch 处理异常,finally 块中的语句都会执行。
  • 借助 finally 的特质可以帮助合并按钮防重和数据重置的功能。
  • 如果 finally块 语句中返回一个值,那么这个值将会成为整个 try-catch-finally 的返回值。

实现思维方面的收获是:

正向和逆向这两个不同的思维面,也分享了开发过程中不错的功能联想。


作者:非职业「传道授业解惑」的开发者叶一一简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。如果看完文章有所收获,欢迎点赞

标签:语句,异步,return,res,JavaScript,try,finally,catch
From: https://blog.51cto.com/u_15838863/6987238

相关文章

  • 【JavaScript17】eval函数
    eval本身在js里面正常情况下使用的并不多.但是很多网站会利用eval的特性来完成反爬操作.我们来看看eval是个什么鬼?从功能上讲,eval非常简单.它和python里面的eval是一样的.它可以动态的把字符串当成js代码进行运行.vars="1+2+3+4+5+6+7+8";varc=eval(s);//帮你......
  • 【JavaScript16】定时器
    在JS中,有两种设置定时器的方案1、setTimeout//语法规则t=setTimeout(函数,时间)//经过xxx时间后,执行xxx函数//m是第几个定时器varm=setTimeout(function(){console.log("我叫xwl");},5000);//单位是毫秒console.log("正常执行的....");......
  • 【JavaScript15】闭包
    什么是闭包闭包(closure)是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,即形成一个不销毁的栈环境。闭包的特性:函数嵌套函数内部函数可以访问外部函数的变量参数和变量不会被回收。为什么要有闭包?1、先来看一段代码发现没有......
  • 【JavaScript14】函数基础
    函数定义函数定义的方法有多种,主要分为函数声明和函数表达式//函数声明functionfunc(arg1,arg2){console.log("arg1=",arg1);console.log("arg2=",arg2);return"返回一些东西"}varret=func("苹果","鸭梨");console.log(......
  • 【JavaScript11】正则表达式 RegExp对象
    定义正则表达式(英语:RegularExpression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。创建RexExp对象有两种方式创建RexExp对象第一种:使用字面量创建RegExp对象的语法:第......
  • javascript 浮点运算库big.js
    big.js浮点运算库安装npminstallbig.js使用constBig=require('big.js');orimportBigfrom"big.js";x=newBig(0.3)x.minus(0.1)//"0.2"Api常量定义big.js的常量定义一共有5个,分别的含义是:DP,小数点后位数,默认值是20RM,四舍五入方式,默认为1,代表向最近......
  • javascript~常用工具类的封装
    JavaScript1.type类型判断isString(o){//是否字符串returnObject.prototype.toString.call(o).slice(8,-1)==='String'}isNumber(o){//是否数字returnObject.prototype.toString.call(o).slice(8,-1)==='Number'}isObj(o){//是否对象......
  • 全能指挥官:玩转JavaScript命令模式,让代码听你的话!
    前言系列首发于公众号『非同质前端札记』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。全能指挥官:玩转JavaScript命令模式,让代码听你的话!命令模式的含义命令模式指的是一个执行某些特定的指令。命令模式的示例demo://命令接口classCommand{execute(){......
  • 【JavaScript10】Date日期对象
    获取当前系统时间vard=newDate();//当前系统时间console.log(d);//SunAug06202314:49:43GMT+0800(中国标准时间)手动获取时间并且格式化vard=newDate();//当前系统时间console.log(d);//SunAug06202314:49:43GMT+0800(中国标准时间)var......
  • 【JavaScript08】字符串基本操作
    字符串基本方法,本文只对部分方法做了说明其它更多参考菜鸟教程https://www.runoob.com/jsref/jsref-obj-string.htmls.split()字符串切割s.substr(start,len)字符串切割,从start开始切,切len个字符;如果len不给,直接切到最后s.substring(start,end)字符串切割,从st......