【问题标题】:jQuery $.ajax error handling [duplicate]jQuery $.ajax 错误处理
【发布时间】:2012-02-25 13:26:58
【问题描述】:

可能重复:
jQuery ajax error function

由于我们在实现中观察到的问题,我正在尝试将“全局”ajax 错误处理程序替换为我可以从每个 ajax 调用中调用的函数。

$(document).ajaxError(function(e, jqXHR, settings, exception) {
    // using BrowserDetect function to get browser info
    var browser    = BrowserDetect.browser;
    var browserVer = BrowserDetect.version;
    var browserOS  = BrowserDetect.OS;
    var ajax_url   = settings.url;
    $.ajax({async: true, 
            type:     'POST',
            url:      AJAX_ERROR_LOG_URL, 
            dataType: 'json',
            data:     'host='myhost.com&status='+jqXHR.status+'&error='+jqXHR.responseText+'&expmessage='+exception.message+'&url=' 
                       +ajax_url+'&browser='+browser+'&browserVer='+browserVer+'&browserOS='+browserOS
    });
    if (jqXHR.status === 0) {
        final_message(ERROR_MSG + '0'); // Not connected. Please verify network is connected.
    } else if (jqXHR.status == 404) {
        final_message(ERROR_MSG + '404'); // Requested page not found. [404]
    } else if (jqXHR.status == 500) {
        final_message(ERROR_MSG + '500'); // Internal Server Error [500].
    } else if (exception === 'parsererror') {
        final_message(ERROR_MSG + '1'); // Requested JSON parse failed.
    } else if (exception === 'timeout') {
        final_message(ERROR_MSG + '2'); // Time out error.
    } else if (exception === 'abort') {
        final_message(ERROR_MSG + '3'); // Ajax request aborted.
    } else {
      if(browserVer == '7' && browser == 'Explorer') {
        final_message(ERROR_MSG + '100'); // Uncaught Error
      } else {
        final_message(ERROR_MSG + '99'); // Uncaught Error
      }
    }
});

我想把它转换成一个函数并像这样调用它:

$.ajax({async: true, 
        type:'POST',
        url: url, 
        dataType: 'json', 
        data:     "username="+username+"&password="+pass,
        success:  ajaxLoginResult
        error:    logAjaxError(jqXHR, textStatus, errorThrown)
});

function logAjaxError(jqXHR, textStatus, errorThrown) {
  // more code here to log the error
}

问题在于我无法获取传递给错误回调的 ajax 调用的 url,因为传递的唯一内容是 jqXHR、textStatus、errorThrown。在 .ajaxError 设置中,设置被传递,这就是我们获取 url 的地方。 有什么想法吗?

编辑 2/3: 下面是 Add_Course 函数供您查看:

function Add_Course(reason) {
  var eventid = $('#eventid'+$('#obleventcode').attr('value')).val();
  var url = AJAX_URL_ADDTOCART + '?sku='+eventid+'&mainitem=true&pid='+pid;
  if(reason != 'VOUCHER'){
    log_url(url);
    $.ajax({async: true, 
            type:'POST',
            url: url, 
            dataType: 'json', 
            success: function(data){
              if(data.result=='success') {
                var cemsg_index=reason.indexOf('CEMSG');
                if(cemsg_index>=0) {
                  final_ce_message(reason.substr(cemsg_index+6));
                } // if(cemsg_index>=0)
              } else {
                $('#sm_content .oblcontent').html(data.message);
              } // if(data.result=='success')
            },
            complete: function(jqXHR, textStatus) {
              log_url('redirecting to cart');
              window.location = CART_URL;
            } // complete
    });
  }
}

【问题讨论】:

    标签: jquery ajax error-handling


    【解决方案1】:

    首先,恭喜您实际检查错误。如此多的人编写的代码从没想过在互联网上会出错。哈。

    您可以调用$.ajaxSetup() 来让每个调用都将您的函数用于错误处理程序,而不是编辑对$.ajax 的每个调用。错误处理程序签名是error(jqXHR, textStatus, errorThrown),它与您的函数很方便地匹配,因此在您执行任何$.ajax 调用之前尝试调用$.ajaxSetup({ error: logAjaxError })。

    【讨论】:

    • 这就是我想要摆脱的。设置 .ajaxError() 设置 GLOBAL ajax 错误处理程序,就像使用 .ajaxSetup 一样。我不想那样做。这样做会导致我们当前的一些代码出现问题。
    • 我也在读到错误:$.ajax 调用的一部分被贬低了,你应该像这样使用它 var xhr = $.ajax(...) 然后检查 xhr。失败。有什么想法吗?
    • 你能解释一下问题吗?
    • 在 ajax 调用的成功函数中重定向到另一个页面时正在调用错误处理程序。有没有更好的处理方法?
    • 不确定我是否在关注。您发出 $.ajax 请求 A,在其成功处理程序中发出 $.ajax 请求 B,并且该请求在发生 304 重定向时调用其错误处理程序?
    【解决方案2】:

    您应该能够在错误回调中访问this.url:

    error:    logAjaxError(jqXHR, textStatus, errorThrown, this.url)
    

    【讨论】:

    • 想要一个“全局”的 ajax 错误处理程序,但不能这样做,抱歉。我必须在每个 ajax 调用中写下来。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2012-09-25
    • 2011-06-16
    相关资源
    最近更新 更多