您现在的位置是:首页 > Javascript
当前栏目
异步错误处理
2023-02-18 15:29:02 时间
编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。
例如,setTimeout()
函数可以传入回调函数,并在指定若干毫秒后执行:
function printTime() {
console.log('It is time!');
}
setTimeout(printTime, 1000);
console.log('done');
上面的代码会先打印done
,1秒后才会打印It is time!
。
如果printTime()
函数内部发生了错误,我们试图用try包裹setTimeout()
是无效的:
'use strict';
----
function printTime() {
throw new Error();
}
try {
setTimeout(printTime, 1000);
console.log('done');
} catch (e) {
console.log('error');
}
----
// 直接运行,看是否会alert
原因就在于调用setTimeout()
函数时,传入的printTime
函数并未立刻执行!紧接着,JavaScript引擎会继续执行console.log('done');
语句,而此时并没有错误发生。直到1秒钟后,执行printTime
函数时才发生错误,但此时除了在printTime
函数内部捕获错误外,外层代码并无法捕获。
所以,涉及到异步代码,无法在调用时捕获,原因就是在捕获的当时,回调函数并未执行。
类似的,当我们处理一个事件时,在绑定事件的代码处,无法捕获事件处理函数的错误。
例如,针对以下的表单:
<form>
<input id="x"> + <input id="y">
<button id="calc" type="button">计算</button>
</form>
我们用下面的代码给button绑定click事件:
'use strict';
var $btn = $('#calc');
// 取消已绑定的事件:
$btn.off('click');
----
try {
$btn.click(function () {
var
x = parseFloat($('#x').val()),
y = parseFloat($('#y').val()),
r;
if (isNaN(x) || isNaN(y)) {
throw new Error('输入有误');
}
r = x + y;
alert('计算结果:' + r);
});
} catch (e) {
alert('输入有误!');
}
但是,用户输入错误时,处理函数并未捕获到错误。请修复错误处理代码。
相关文章
- JavaScript 入门基础 / 概念介绍(一)
- Vue + SpreadJS 实现高性能数据展示与分析
- SpreadJS集算表联动数据透视表,高效实现前端数据多维分析
- 如何用 JavaScript 编写你的第一个单元测试
- 如何在JavaScript中使用for循环
- JavaScript中的箭头函数
- 有用的内置Node.js APIs
- 你不知道的JavaScript APIs
- 如何在JavaScript中使用高阶函数
- React报错之Property does not exist on type 'JSX.IntrinsicElements'
- 检查原生 JavaScript 函数是否被覆盖
- React报错之Type '() => JSX.Element[]' is not assignable to type FunctionComponent
- React报错之JSX element type does not have any construct or call signatures
- React报错之组件不能作为JSX组件使用
- 理解JavaScript中的window对象
- 让Node项目支持可扩展的环境配置
- 使用 DevTools 加速调试 Node.js 应用程序
- 讲述JSON Web Token(概念)
- ?RxJs合并接口应用案例
- 如何让Node服务实现自动重启