美文网首页
【五十一】异步错误处理

【五十一】异步错误处理

作者: 八宝君 | 来源:发表于2017-02-07 17:46 被阅读0次

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

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

    function printTime() {
        console.log('It is time!');
    }
    
    setTimeout(printTime, 1000);
    console.log('done');
    

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

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

    function printTime() {
        throw new Error();
     }
    
    tyr {
        setTimeout(printTime, 1000);
        console.log('done');
    }  catch (e) {
        alert('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事件:

    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('输入有误!');
    }
    

    但是,用户输入错误时,处理函数并未捕获到错误。请修复错误处理代码。
    所以可以这么写:

    $btn.click(function () {
        var
            x = parseFloat($('#x').val()),
            y = parseFloat($('#y').val()),
            r;
            try {
                    if (isNaN(x) || isNaN(y)) {
                        throw new Error('输入有误');
                    }
            }catch (e) {
                alert('输入有误!');
            }
            r = x + y;
            alert('计算结果:' + r);
    });
    

    相关文章

      网友评论

          本文标题:【五十一】异步错误处理

          本文链接:https://www.haomeiwen.com/subject/gyfmittx.html