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 相关文章推荐
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
eval的两组性能测试数据
Aug 17 Javascript
javascript同页面多次调用弹出层具体实例代码
Aug 16 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
Dec 10 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
Nov 17 Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 Javascript
微信小程序 蓝牙的实现实例代码
Jun 27 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
深入解析微信小程序开发中遇到的几个小问题
Jul 11 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 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
PHP版国家代码、缩写查询函数代码
2011/08/14 PHP
php目录操作实例代码
2014/02/21 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
如何在Linux上安装Node.js
2016/04/01 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
vue webpack开发访问后台接口全局配置的方法
2018/09/18 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python2随机数列生成器简单实例
2017/09/04 Python
Python判断两个对象相等的原理
2017/12/12 Python
使用numba对Python运算加速的方法
2018/10/15 Python
多个python文件调用logging模块报错误
2020/02/12 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
python分布式爬虫中消息队列知识点详解
2020/11/26 Python
python之随机数函数的实现示例
2020/12/30 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
HTML5实现视频弹幕功能
2019/08/09 HTML / CSS
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
合伙协议书范本
2014/04/21 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
理财计划书
2014/08/14 职场文书
新兵入伍心得体会
2014/09/04 职场文书
干部年终考核评语
2015/01/04 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书