promise的try catch,element表单验证的优雅方法

一个好习惯,先给结论

对promise进行封装改造,更方便、优雅地进行异步操作。完整代码库→:github

本文首发于blog.gis1024.com

这里才是引言

事情的起因是这样的:

在写苗刻地图项目时,遇到一个问题:表单验证怎么优雅进行,又或者说异步promise的异常怎么优雅处理。

element的表单验证举例来说,写一个登陆表单时,点击登陆前需要验证账号密码是否都填写了,验证成功后再发起登陆请求。

简短代码如下:

<template>
    ....
    <el-form ref="formRef" ...></el-form>
    ....
</template>

<script setup>
    ....
    const formRef = ref(null);
    await formRef.value.validate(); // 表单验证,比如验证用户名密码是否都填写
    /*-----  验证成功后的操作  -----*/
    // 比如发起请求
    axios.post('xx/xx',{})
    ....
</script>

分析一下以上代码可以知道,验证成功后可以发起后续的登陆请求;验证不成功,则验证那行直接就抛异常了,后续登陆请求自然也就不会执行。

从最终结果上来说,这样的代码是符合整个功能逻辑的。但是,每次验证不成功时,没有处理抛出的异常。这样会带来两个问题:

  1. 控制台会飘红,打印抛出的异常;
  2. 如果前端做了一些异常监控的话,会将这些异常监控到并上传到服务器,造成脏数据事小,被领导觉得搞出bug来就问题大了。

一般的处理方式

作为一个老前端,这个问题肯定不会是现在才遇到,以前都是怎么处理的呢?

  1. element也提供回调的验证方式,使用回调方法进行验证
  2. 不使用await,直接使用promise.then().catch()
  3. 使用 try{} catch(e){}

1和2不必说了,很容易理解,但是会增加代码的缩进,增加后续心智负担,await用惯了自然不喜欢这种方式。

我们来看看3的处理方式:

<template>
    ....
    <el-form ref="formRef" ...></el-form>
    ....
</template>

<script setup>
    ....
    try {
        const formRef = ref(null);
        await formRef.value.validate(); // 表单验证,比如验证用户名密码是否都填写
        /*-----  验证成功后的操作  -----*/
        // 比如发起请求
        axios.post('xx/xx',{})
    } catch(e){
        console.log('验证不成功咯')
    }
    ....
</script>

以上代码使用try catch包裹了一大坨,甚至还不如使用方法1和2。

我们需要一种更优雅的方式来实现

更优雅的处理方式

直接上代码了哈

to.js文件如下:

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

export default to;

在上述的表单验证中,这么来写:

<template>
    ....
    <el-form ref="formRef" ...></el-form>
    ....
</template>

<script setup>
    import to from 'to.js'
    ....
    const formRef = ref(null);
    const [err,res] = await to(formRef.value.validate()); // 表单验证,比如验证用户名密码是否都填写
    if(err) return;
    /*-----  验证成功后的操作  -----*/
    // 比如发起请求
    axios.post('xx/xx',{})
    ....
</script>

分析下上面的的代码,是将promise进行了一层包裹,resolve时,返回两个值:异常和原本的结果值。

这样的好处是,既不需要包裹层层的try catch,也不需要使用.then回调增加缩进,更不会在控制台留下异常报错。如果有需要,还能对返回的异常进行业务对应的判断处理。

结语

使用一个简单的函数包装,即可实现promise的优雅异常处理。该方法不仅可以使用在表单验证中,所有使用await的地方,皆可使用该方法来包裹,代码逻辑非常清晰。

本文首发于blog.gis1024.com

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: promise是一种异步编程的解决方案,可以避免回调地狱的问题。try catch是一种错误处理的机制,可以捕获代码中的异常并进行处理。在使用promise时,可以使用try catch来捕获promise中的错误,以便进行相应的处理。例如,在promise中使用try catch可以捕获异步操作中的错误,并返回一个reject状态的promise对象,以便在后续的操作中进行错误处理。 ### 回答2: promise是一种用于处理异步操作的机制,它可以更好地管理和控制异步代码的执行流程。而try-catch则是一种错误处理机制,用于捕获和处理代码中可能出现的异常。 在使用promise时,我们可以通过使用try-catch来捕获和处理promise中的错误。通常情况下,promise内部的代码是异步执行的,当代码执行出错时,promise会将错误抛出,我们可以使用catch方法来捕获这个错误并进行相应的处理。catch方法接受一个回调函数作为参数,这个回调函数会被执行并传入错误对象作为参数。 一个常见的promise try-catch的用法是在catch方法中打印错误信息或者进行错误处理。例如: ```JavaScript function fetchData() { return new Promise((resolve, reject) => { // 异步操作 // 如果出错,调用reject并传入错误信息 reject(new Error("数据获取失败")); }); } try { fetchData() .then(data => { // 处理数据 }) .catch(error => { // 打印错误信息 console.log(error.message); // 进行错误处理 }); } catch (error) { console.log('捕获到了错误:', error); } ``` 上面的代码中,fetchData函数返回了一个promise,当异步操作出错时,会调用reject方法并传入一个错误对象。在try-catch块中,我们调用fetchData函数,并使用then方法来处理成功情况。如果发生错误,catch方法会被调用,错误信息会被打印,并且可以进行相应的错误处理。 总而言之,promisetry-catch可以配合使用来处理异步操作的错误。promise提供了一种管理异步代码的机制,try-catch则提供了一种捕获和处理错误的机制,二者结合可以更好地处理和管理异步代码的错误。 ### 回答3: promiseJavaScript中的一种处理异步操作的方法,它是一个表示异步操作最终完成或失败的对象。promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 try catchJavaScript中的异常处理机制。当我们在执行代码时,如果出现异常,程序就会停止执行,并抛出一个错误。为了避免程序直接停止,我们可以使用try catch来捕获错误并进行处理。 promisetry catch的使用方式如下: 1. promise的用法: 1.1 创建promise对象:使用new Promise()构造函数来创建一个promise对象,并传入一个执行器函数。 1.2 执行异步操作:在执行器函数中写入异步操作的代码,当异步操作完成时,调用resolve()方法promise的状态改为fulfilled,若出现错误,则调用reject()方法promise的状态改为rejected。 1.3 处理结果:使用.then()方法来处理异步操作的结果。 2. try catch的用法: 2.1 将可能引发异常的代码放在try代码块中。 2.2 若try代码块中的代码出现错误,则异常会被抛出。 2.3 catch代码块会捕获并处理try代码块中抛出的异常。 当我们使用promise时,我们可以通过.catch()方法来捕获异步操作中的错误,并进行处理。这样可以避免程序直接停止执行,同时也更方便地处理错误情况。 例如: ``` function fetchData() { return new Promise((resolve, reject) => { // 执行异步操作 if (异步操作成功) { resolve(结果); } else { reject(错误); } }); } // 使用promise的方式处理异步操作 fetchData() .then((result) => { // 处理成功结果 }) .catch((error) => { // 处理错误情况 }); // 使用try catch的方式处理异常 try { // 可能引发异常的代码 } catch (error) { // 异常处理 } ``` 总而言之,promise用于异步操作的处理,try catch用于捕获和处理代码执行时可能出现的异常。在编写JavaScript代码时,我们可以根据具体的情况选择合适的方式来处理异步操作和异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值