获取导致ajax错误的函数名称

时间:2015-07-09 11:17:36

标签: javascript jquery ajax

我使用我的第一个全局错误处理程序进行ajax调用,在那里我获取错误信息,将其发送到PHP脚本然后记录结果:

$(document).ajaxError(function(event, request, settings){

    //get the error and log the results
    var file = window.location.href;
    var verbose_error;
    verbose_error = 'Ajax error: ' + request.responseText + '\n\n';
    verbose_error += 'Status:' + request.status + '\n\n';
    verbose_error += 'Status Text:' + request.statusText + '\n\n';
    verbose_error += 'Url: ' + settings.url  + '\n\n';
    verbose_error += 'Data: ' + settings.data  + '\n\n';
    verbose_error += 'Data Type: ' + settings.dataType  + '\n\n';
$.post(getUrl() + 'error/log-ajax-error',{file : file,verbose_error : verbose_error},function(o){

});
});

当我为PHP脚本执行错误处理时,我可以获得堆栈跟踪以查看实际导致错误的函数。假设我的所有ajax调用都是在其他函数中执行的,我是否可以获得导致有问题的ajax调用的函数名称?

例如,在下面的代码中,如果$ .post返回错误,我希望能够访问名称badAjaxCall,然后将其放在我的日志中以帮助调试。

function badAjaxCall() {
$.post(url,data,function(o){

});
}

1 个答案:

答案 0 :(得分:2)

创建new Error()并获取stack。哟将拥有所有细节。 只要您没有throw错误,最终用户就不会注意到它。 如果您想在浏览器控制台中获得反馈,也可以throw error

function foo() {
  baz();
}
function baz() {
  foobar();
}
function foobar() {
  var error = new Error();
  alert(error.stack)
}
foo();

如果是异步,则会有所不同 如果您在XHR处理程序中创建错误,则不会获得任何堆栈 因此,您必须在发送XHR之前创建错误,然后在XHR处理程序中获取堆栈(如果需要)。

function foo() {
  baz();
}
function baz() {
  foobar();
}
function foobar() {
  var error = new Error();
  //setTimeout represent your XHR call
  setTimeout(function() {
      alert(error.stack)
  }, 100)
}
foo();

在你的情况下,这将是:

function ajaxCallWrapper(url, data, handler) {
    //never call direct $.post
    //instead always call this function to do an xhr call

    var error = new Error();
    $.post(url, data, function(o){
        if(o.error) {
            //in case of error, show the stack
            alert(error.stack);
            return;
        }
        //otherwise call the handler
        handler(o);
    });
}
function badAjaxCall() {
    ajaxCallWrapper(url,data,function(o){});
}
function normalAjaxCall() {
    ajaxCallWrapper(url,data,function(o){});
}