54、JavaScript 异步错误处理

编写JavaScript代码时,我们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行,而回调函数的执行需要等到下一个满足条件的事件出现后,才会被执行。

 

例如,setTimeout()函数可以传入回调函数,并在指定若干毫秒后执行:

  1. function printTime() {
  2. console.log('It is time!');
  3. }
  4. setTimeout(printTime, 1000);
  5. console.log('done');

上面的代码会先打印done,1秒后才会打印It is time!。

 

如果printTime()函数内部发生了错误,我们试图用try包裹setTimeout()是无效的:

  1. 'use strict';
  2. function printTime() {
  3. throw new Error();
  4. }
  5. try {
  6. setTimeout(printTime, 1000);
  7. console.log('done');
  8. catch (e) {
  9. alert('error');
  10. }
  11. // 直接运行,看是否会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事件:

  1. 'use strict';
  2. var $btn = $('#calc');
  3. // 取消已绑定的事件:
  4. $btn.off('click');
  5. try {
  6. $btn.click(function () {
  7. var
  8. x = parseFloat($('#x').val()),
  9. y = parseFloat($('#y').val()),
  10. r;
  11. if (isNaN(x) || isNaN(y)) {
  12. throw new Error('输入有误');
  13. }
  14. r = x + y;
  15. alert('计算结果:' + r);
  16. });
  17. catch (e) {
  18. alert('输入有误!');
  19. }

 

但是,用户输入错误时,处理函数并未捕获到错误。请修复错误处理代码。JavaScript 异步错误处理

付杰
  • ¥ 98.0元
  • 市场价:398.0元
  • ¥ 98.0元
  • 市场价:298.0元
  • ¥ 159.0元
  • 市场价:499.0元
  • ¥ 189.0元
  • 市场价:269.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: