首页 > 其他分享 >async 和 await 如何捕获异常

async 和 await 如何捕获异常

时间:2023-11-17 14:55:32浏览次数:38  
标签:form btnLoading 捕获 await catch async data

前言

之前代码写法中使用 async 和 await,没有捕获异常,导致不满足 code === 200 条件时,页面无法抛出错误,如下所示:

async 和 await
    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (!valid) return;
        this.btnLoading = true;
        if (this.moduleType === "add") {
          const data = await addInStan(this.form);
          if (data.code === 200) {
            this.$message.success("新增成功");
            this.cancel();
            this.loadInStans();
          } else {
            this.btnLoading = false;
          }
        } else {
          const data = await editInStan(this.form);
          if (data.code === 200) {
            this.$message.success("编辑成功");
            this.cancel();
            this.loadInStans();
          } else {
            this.btnLoading = false;
          }
        }
      });
    },

后来采取了 .then().catch() 的写法,如下所示。但还是觉得不如 async 和 await 简洁。

.then().catch()
    submitForm() {
      this.$refs["form"].validate((valid) => {
        if (!valid) return;
        this.btnLoading = true;
        if (this.moduleType === "add") {
          addInStan(this.form)
            .then(() => {
              this.$message.success("新增成功");
              this.cancel();
              this.loadInStans();
            })
            .catch(() => (this.btnLoading = false));
        } else {
          editInStan(this.form)
            .then(() => {
              this.$message.success("编辑成功");
              this.cancel();
              this.loadInStans();
            })
            .catch(() => (this.btnLoading = false));
        }
      });
    },

再后来,看到了 try{} catch(err){} 的写法,如下所示,也能捕获异常。但代码也不够简洁。

try{} catch(err){}
    async querySearch(queryString, cb) {
      try {
        let para = {
          ...this.additionParas,
          [this.searchKey]: queryString,
        };
        if (this.isScrollPage) {
          // 输入框失去焦点后再次获焦时,重置页码
          this.pageNum = 1;
          para.pageNum = this.pageNum;
        }
        let { data } = await queryData(para, this.queryUrl);
        if (data.rows) {
          let arr = [];
          data.rows.forEach((item) => {
            // 下拉框选项要转为字符串,避免选择后,导致 autocomplete 组件绑定值为数字而报错
            arr.push({ [this.valueKey]: item.toString() });
          });
          // 若有数据,则显示,否则隐藏下拉框
          if (arr.length) {
            this.$refs[this.refName].activated = true;
            cb(arr);
          } else {
            // 无数据,不显示下拉框
            cb([]);
          }
        }
        this.total = data.totle || 0;
      } catch (err) {
        console.log({ err });
      }
    },

解决

直接 await interfaceName(para).catch((err) =>{}) 就可捕获异常。

相关代码
    submitForm() {
      this.$refs["form"].validate(async (valid) => {
        if (!valid) return;
        this.btnLoading = true;
        if (this.moduleType === "add") {
          const data = await addInStan(this.form).catch(
            () => (this.btnLoading = false)
          );
          if (data.code !== 200) return;
          this.$message.success("新增成功");
          this.cancel();
          this.loadInStans();
        } else {
          const data = await editInStan(this.form).catch(
            () => (this.btnLoading = false)
          );
          if (data.code !== 200) return;
          this.$message.success("编辑成功");
          this.cancel();
          this.loadInStans();
        }
      });
    },

参考链接

不是吧?async/await异常捕获你还在用try-catch~

标签:form,btnLoading,捕获,await,catch,async,data
From: https://www.cnblogs.com/shayloyuki/p/17838725.html

相关文章

  • 你真的了解@Async吗?
    使用场景:开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑,比如消息推送、商品同步等都可以使用异步方法,这时我们可以用到@Async。但是直接使用@Async会有风险,当我们没有指定线程池时,他会默认使用其Spring自带的SimpleAsyncTaskExecutor线程池,会不断的创建线程,当并......
  • 如何通过 wireshark 捕获 C# 上传的图片
    一:背景1.讲故事这些天计划好好研究下tcp/ip,以及socket套接字,毕竟工控中设计到各种交互协议,如果只是模模糊糊的了解,对分析此类dump还是非常不利的,而研究协议最好的入手点就是用抓包工具wireshark,废话不多说,这篇通过wireshark提取一个小图片作为入手。二:wireshark图片抓包1......
  • (exp)/1 用 `\1` 对分组(exp)进行捕获
    关于正则表达式,下列说法正确的是:A\w用来匹配数字B/a?/表示匹配0到多个aCi修饰符表示忽略大小写D1表示对第一个捕获组的引用正确答案:C\w匹配字母数字或下划线;?匹配0个或1个;\1表示对第一个捕获组的引用;1、\w表示字母、数字、下划线\W表示除了字母、数字下划线的字符......
  • fltk-rs如何捕获特定按键
    Rust语言这里演示了使用handle函数捕获“E”和向下键。usefltk::{prelude::*,*,window::Window,app::event_key};fnmain(){letapp=app::App::default().with_scheme(app::Scheme::Gleam);letmutwind=Window::default().with_size(100,100);letmu......
  • C# httpClient.PostAsync时出现问题Result =“ {尚未计算}”
    返回错误1:Id=3129,Status=WaitingForActivation,Method="{null}",Result="{Notyetcomputed}"返回错误2:发生了一个或多个错误Oneormoreerrorsoccurred.atSystem.Threading.Tasks.Task.ThrowIfExceptional(BooleanincludeTaskCanceledExceptions)......
  • Python3 协程 await async 相关的用法和笔记
    想要提供可以进行协程切换的awaitable,可以使用下面的方法:1任务taskasyncdeffunc():print("yesWait")task=asyncio.create_task(func())awaittask2协程对象,可以使asyncdef定义的协程函数(是否能触发切换不一定,要看函数内容)函数内可以利用asyncio.sl......
  • .NET6中的await原理浅析
    前言看过不少关于await的原理的文章,也知道背后是编译器给转成了状态机实现的,但是具体是怎么完成的,回调又是如何衔接的,一直都没有搞清楚,这次下定决心把源码自己跑了下,终于豁然开朗了本文的演示代码基于VS2022+.NET6示例publicclassProgram{staticint......
  • 大师学SwiftUI第9章Part 1 - 异步并发之Task、Async、Await和错误
    其它相关内容请见虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记苹果系统借助现代处理器的多核可同步执行多条代码,提升同一时间内程序所能执行的任务。例如,一段代码从网上下载文件,另一段代码可以在屏幕上显示进度。此时,我们不能等待第一个执行完后再执行第二个,而必须要同步执行这......
  • 异常处理机制(二)之异常处理与捕获
    一、异常概述1Error(错误):是指程序无法处理的错误,表示运行应用程序时比较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。2异常(Exception):是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。通俗的说,......
  • 异常处理机制(二)之异常捕获
    1.try…catch代码如下:单个捕获异常 如有异常会进入catch中输出异常!!!2.try…catch…catch多个捕获异常 进入异常代码块后try会终止运行3.try…catch…finally捕获异常并输出finally代码块 注:finally代码块只要不是系统异常终止都会运行4.try…finally代......