Javascript中async与await的捕捉错误详解


Posted in Javascript onMarch 03, 2022

async与await捕捉错误

正常的输出时

<template>
  <div class="hello">
	</div>
</template>

<script>
export default {
  name: 'HelloWorld',
  created() {
    this.init()
  },
  methods: {
    init() {
      let p1 = new Promise((resolve) => {
        setTimeout(() => {
          resolve(666)
        }, 1000)
      })
      async function run() {
        let res = await p1
        console.log('res', res)
      }
      run()
      // 正常的调用时候:log输出 666
    },
  },
}
</script>

try catch捕捉错误

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>
      For a guide and recipes on how to configure / customize this project,<br />
      check out the
      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
    </p>
    <h3>Installed CLI Plugins</h3>
    <ul>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
    </ul>
    <h3>Essential Links</h3>
    <ul>
      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
    </ul>
    <h3>Ecosystem</h3>
    <ul>
      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String,
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      let p1 = new Promise((reject) => {
        setTimeout(() => {
          reject(new Error('错误了哦'))
        }, 1000)
      })
      async function run() {
        try {
          let res = await p1
          console.log('res', res)
        } catch (error) {
          console.log('error', error)
        }
      }
      run()
      // 报错运行 res Error: 错误了哦
    },
  },
}
</script>

多个异步嵌套时

没有try {} catch {} 捕捉错误的

<template>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String,
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      let p1 = new Promise((resolve) => {
        setTimeout(() => {
          // reject(new Error('错误了哦'))
          resolve(1)
        }, 1000)
      })
      let p2 = function (arg) {
        return new Promise((reject) => {
          setTimeout(() => {
            console.log('arg', arg)
            reject(new Error('错误了哦'))
          }, 1000)
        })
      }
      async function run() {
        const res1 = await p1
        console.log('res1', res1) // 1
        const res2 = await p2(res1)
        console.log('res2', res2) // res2 Error: 错误了哦
      }
      run()
    },
  },
}
</script>

适使用try{} catch {} 捕捉错误的

<template>
  <div>HelloWorld</div>
</template>

<script>
export default {
  name: 'HelloWorld',
  components: {},
  data() {
    return {}
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      let p1 = new Promise((resolve) => {
        setTimeout(() => {
          // reject(new Error('错误了哦'))
          resolve(1)
        }, 1000)
      })
      let p2 = function (arg) {
        return new Promise((reject) => {
          setTimeout(() => {
            console.log('arg', arg)
            reject(new Error('错误了哦'))
          }, 1000)
        })
      }
      async function run() {
        try {
          var res1 = await p1
          console.log('res1', res1)
        } catch (error) {
          return new Error('error1', error)
        }
        try {
          const res2 = await p2(res1)
          console.log('res2', res2)
        } catch (error) {
          return new Error('error2', error)
        }
      }
      run()
    },
  },
}
</script>
<style lang="scss" scoped></style>

效果

Javascript中async与await的捕捉错误详解

 await-to-js

await-to-js官网

异步嵌套使用了try,代码相对不够智能

  • 特别使用第三方的npm包 await-to-js
  • 作用:无需 try-catch 即可轻松处理错误的异步等待包装器
  • 下载:yarn add await-to-js -S
  • 使用
<template>
  <div>HelloWorld</div>
</template>

<script>
import awaitTo from 'await-to-js'
export default {
  name: 'HelloWorld',
  components: {},
  data() {
    return {}
  },
  created() {
    this.init()
  },
  methods: {
    init() {
      let p1 = new Promise((resolve) => {
        setTimeout(() => {
          // reject(new Error('错误了哦'))
          resolve(1)
        }, 1000)
      })
      let p2 = function (arg) {
        return new Promise((reject) => {
          setTimeout(() => {
            console.log('arg', arg)
            reject(new Error('错误了哦'))
          }, 1000)
        })
      }
      async function run() {
        const [err, res1] = await awaitTo(p1)
        if (err) throw new Error('错误1')
        console.log('res1', res1)
        const [err2, res2] = await awaitTo(p2(res1))
        if (err2) throw new Error('错误2')
        console.log('res2', res2)
      }
      run()
    },
  },
}
</script>
<style lang="scss" scoped></style>

效果:

Javascript中async与await的捕捉错误详解

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容!       

Javascript 相关文章推荐
javascript 可以拖动的DIV(二)
Jun 26 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 Javascript
javascript的动态加载、缓存、更新以及复用(一)
Jun 09 Javascript
一波JavaScript日期判断脚本分享
Mar 06 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
Jul 05 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
vue综合组件间的通信详解
Nov 06 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
vue 实现小程序或商品秒杀倒计时
Apr 14 Javascript
vue el-table实现自定义表头
Dec 11 Javascript
JS使用正则表达式实现常用的表单验证功能分析
Apr 30 Javascript
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue如何清空对象
Mar 03 #Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 #Vue.js
javascript之Object.assign()的痛点分析
Mar 03 #Javascript
vue实现移动端div拖动效果
Mar 03 #Vue.js
vue实现滑动解锁功能
JavaScript最完整的深浅拷贝实现方式详解
Feb 28 #Javascript
Vue全局事件总线你了解吗
Feb 24 #Vue.js
You might like
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
ThinkPHP 连接Oracle数据库的详细教程[全]
2012/07/16 PHP
深入PHP变量存储的详解
2013/06/13 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
利用js编写网页进度条效果
2017/10/08 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
Python文件和流(实例讲解)
2017/09/12 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
树莓派升级python的具体步骤
2020/07/05 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
生产部经理岗位职责
2013/12/16 职场文书
行政副总岗位职责
2014/02/23 职场文书
实习指导老师评语
2014/04/26 职场文书
岗位说明书范文
2014/05/07 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
情人节单身感言
2015/08/03 职场文书
宪法宣传标语100条
2019/10/15 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB