在正确的上下文中捕获异步异常

时间:2015-01-25 09:27:28

标签: javascript jquery asynchronous

在异步调用中抛出错误时,在tryAjax()上下文消失后抛出错误,因此永远不会达到我的catch子句。

有没有办法正确捕获非同步异常?

function tryAjax(){
     try{
      didItWork(); 
     }
     catch(e){
       // Do something else
     }
    }

function didItWork(){
        $.ajax({
            url: url,
            success: function (res, status, xhr)
            { 
               // Do something
            },
            error: function (e)
            {
                throw new Error('Canvas video not loaded');                
            }
        });
    };
}

3 个答案:

答案 0 :(得分:2)

  

有没有办法正确捕获非同步异常?

到异常发生时,控件已经移动,不再在try/catch范围内。此外,正如您所发现的,jQuery捕获并抑制error回调中的异常。

在这种特定情况下,通常的做法是让didItWork接受回调或返回一个承诺,并调用该回调或用您想要的值(成功)或标志值来解析/拒绝该承诺表示失败。

这是一个承诺的例子:

function tryAjax(){
    didItWork()
        .done(function(data) {
            // All good, use `data`
        })
        .fail(function(err) {
            // Failed, details in `err`
        });
}

function didItWork(){
    var d = new $.Deferred();
    $.ajax({
        url: url,
        success: function (res, status, xhr)
        { 
           d.resolveWith(res);
        },
        error: function (e)
        {
            d.rejectWith(new Error('Canvas video not loaded'));
        }
    });
    return d.promise();
}

答案 1 :(得分:1)

我会这样做:(使用延迟对象)

function tryAjax(){

  didItWork().fail(function (e){  // Do something specific})
             .done(function(a,b,c){//all ok}); 
}

function didItWork(){
     return   $.ajax({
            url: url,
            success: function (res, status, xhr)
            { 

            },
            error: function (e)
            {
               //something general           
            }
        });
    };
}

答案 2 :(得分:0)

您可以在AJAX

等异步调用中的任何错误时调用方法
 function didItWork(){
    $.ajax({
        url: url,
        success: function (res, status, xhr)
        { 
           // Do something
        },
        error: function (e)
        {
            logError(e);               
        }
    });
    };
 }

 function logError(e)
 {
     //Perform activity related to error handling
 }