异步错误处理 -- 时机
1、编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,
而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。
例如,setTimeout()
函数可以传入回调函数,并在指定若干毫秒后执行:
function printTime() {console.log('It is time!'); }setTimeout(printTime, 1000); console.log('done');// 上面的代码会先打印done,1秒后才会打印It is time!。
2、如果printTime()
函数内部发生了错误,我们试图用try包裹setTimeout()
是无效的
function printTime() {throw new Error(); }try {setTimeout(printTime, 1000);console.log('done'); } catch (e) {console.log('error'); }//不会捕捉到异常,JS引擎报错// VM3520:5 Uncaught Error at printTime (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:5:11)
原因就在于调用setTimeout()
函数时,传入的printTime
函数并未立刻执行!
紧接着,JavaScript引擎会继续执行console.log('done');
语句,而此时并没有错误发生。
直到1秒钟后,执行printTime
函数时才发生错误,但此时除了在printTime
函数内部捕获错误外,外层代码并无法捕获。
所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。
3、类似的,当我们处理一个事件时,在绑定事件的代码处,无法捕获事件处理函数的错误。
<form><input id="x"> + <input id="y"><button id="calc" type="button">计算</button> </form>try {$btn.click(function () {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('输入有误');}r = x + y;alert('计算结果:' + r);}); } catch (e) {alert('输入有误!'); }// VM3523:16 Uncaught Error: 输入有误// at HTMLButtonElement.eval (eval at <anonymous> (extension.js?v=1.0-b1b83dc-2019-05-25T01:51:58Z:61), <anonymous>:16:19)// at HTMLButtonElement.dispatch (jquery.js:3)// at HTMLButtonElement.r.handle (jquery.js:3)
修改代码如下:
$btn.click(function () {try {varx = parseFloat($('#x').val()),y = parseFloat($('#y').val()),r;if (isNaN(x) || isNaN(y)) {throw new Error('输入有误');}r = x + y;alert('计算结果:' + r);} catch (e) {alert('输入有误!');}});
转自:https://www.liaoxuefeng.com/wiki/1022910821149312/1120880431288064
转载于:https://www.cnblogs.com/slightFly/p/11576971.html
异步错误处理 -- 时机相关推荐
- asio boost 异步错误处理_boost::asio::error的用法浅析
boost::asio::error的用法浅析 作者:转载自:asio分享学习快乐更新时间:2009-8-2 一般而言我们创建用于接收error的类型大多声明如下: boost::system::er ...
- asio boost 异步错误处理_boost::ASIO的同步方式和异步方式
http://blog.csdn.net/zhuky/article/details/5364574 http://blog.csdn.net/zhuky/article/details/536468 ...
- python3 异步错误 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop
错误现象 asyncio.Semaphore RuntimeError: Task got Future attached to a different loop asyncio.Semaphore ...
- 爬虫异步错误:raise RuntimeError(‘Event loop is closed‘) RuntimeError: Event loop is closed的解决办法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一. 前言 发现错误:raise RuntimeError('Event loop is closed') Runti ...
- asio boost 异步错误处理_boost asio 学习(五) 错误处理
http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Erro ...
- java 异步事件_处理异步事件的三种方式
在网站开发中,异步事件是项目必然需要处理的一个环节,也因为前端框架的兴起,通过框架实现的 SPA 已经是快速建构网站的标配了,一部获取数据也就成了不可或缺的一环:本文来就讲一讲 JavaScript ...
- 15 错误边界与使用技巧
错误边界 React16增加 防止某个组件的UI渲染错误导致整个应用崩溃 子组件发生JS错误,有备用的渲染UI 错误边界是组件,只能用class组件来写 错误边界组件捕获错误的时机 渲染时 生命周期函 ...
- 浅出Vue 错误处理机制errorCaptured、errorHandler
引子 JavaScript本身是一个弱类型语言,项目中容易发生错误,做好网页错误监控,能帮助开发者迅速定位问题,保证线上稳定. vue项目需接入公司内部监控平台,本人之前vue errorHooks不 ...
- 使用 Async / Await 来编写简明的异步代码
原文链接:https://blog.patricktriest.com/what-is-async-await-why-should-you-care/ 复制代码 停止书写回调函数并爱上ES8 以前, ...
最新文章
- 悬浮球 / 悬浮按钮 / 辅助按钮
- webpack 单独打包指定JS文件
- Windows PE 重定位表编程(枚举重定位地址)
- Android--WebView
- 基础知识巩固四(问题部分)
- 关于空间坐标转化的若干论文
- 打破凉凉诅咒:三个有大量用户基础的区块链项目
- mysql 导入dmp_mysql导入导出sql文件
- POJ2155 Matrix 二维线段树
- [嵌入式]Ubuntu下mini2440的环境搭建-截图记录-转
- Bigemap中添加离线地图数据包 教程
- 电子料盘 电容 物料标识识别
- 【Spinning up】零、DRLib:一个简洁的强化学习库,集成了HER和PER
- 时间换算:UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8
- OpenWRT-Wifidog之利用Luci认证
- C++ opencv视频处理与保存
- 讲座录播|图数据库中的子图匹配算法-邹磊
- 专访趋势科技:全面解析APT攻击过程
- 面试经验 - 如何介绍自己的技能水平?
- 如何添加php的扩展名,PHP如何获得文件的扩展名_PHP教程 - strtolower
热门文章
- 国家卫健委发布第一版新冠疫苗接种技术指南
- 计算机视觉库OpenCV之saturate_cast防数据越界函数
- Tensorflow 2.0的这些新设计,你适应好了吗?
- 我转行成为机器学习和无人车工程师,并收获Offer
- android 如何去掉自定义标签页,Android中为TextView增加自定义的HTML标签
- 电镀用整流电源设计matlab,基于MATLAB的三相整流电路的仿真研究毕业设计论文
- html中右侧三角形代码,如何使用css在标签的右侧添加一个三角形?
- java生成验证码实例_Java生成验证码功能实例代码
- mysql數據庫的增刪改查_MySQL數據庫之基礎增刪改查操作
- python 新建一列_python – 如何处理列名称和创建新列