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的函数
Jan 31 Javascript
很全的显示阴历(农历)日期的js代码
Jan 01 Javascript
JS实现文字放大效果的方法
Mar 03 Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
Oct 28 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
Jan 24 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
详解vue-cli中的ESlint配置文件eslintrc.js
Sep 25 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
vue自定义指令之面板拖拽的实现
Apr 14 Javascript
JS开发自己的类库实例分析
Aug 28 Javascript
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内存不够用的快速解决方法
2013/10/26 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
javascript delete 使用示例代码
2010/03/29 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
自己封装的javascript事件队列函数版
2014/06/12 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JavaScript 表单处理实现代码
2015/04/13 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
小程序实现投票进度条
2019/11/20 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
Python实现遍历数据库并获取key的值
2015/05/17 Python
python复制文件的方法实例详解
2015/05/22 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
django使用graphql的实例
2020/09/02 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
一名毕业生的自我鉴定
2013/12/04 职场文书
运动会致辞稿50字
2014/02/04 职场文书
高中生评语大全
2014/04/25 职场文书
《长征》教学反思
2014/04/27 职场文书
完整版商业计划书
2014/09/15 职场文书
社区活动总结范文
2015/05/07 职场文书
二十年同学聚会致辞
2015/07/28 职场文书